전처리 지시문
전처리기 지시문
자세한 정보: 전처리기 지시문
learn.microsoft.com
#define
매크로 함수라 한다. 단순 치환이 된다.
- 장점: 함수 호출이 아니므로 실행속도가 빠름
- 단점: 실제 코드로 변경되므로 코드 사이즈가 늘어남
#define SUM(a,b) a+b
int main()
{
int result = SUM(3, 5);
return 0;
}
#undef
정의된 매크로를 해제한다.
정의되지 않은 매크로에 해제에 대한 에러가 발생하지 않는다.
다수의 소스파일에서 정의된 매크로를 재정의할 때 사용한다.
#ifdef ~ #endif , #ifndef ~ #endf
단일 매크로 확인에 적합하다. 간결하고 읽기 쉽다.
#include <stdio.h>
#define RELEASE
// #define DEBUG
#ifdef DEBUG
int main()
{
printf("debug mode\n");
return 0;
}
#endif
#ifdef RELEASE
int main()
{
printf("release version\n");
return 0;
}
#endif
#if ~ #elif ~ #else ~ #endif
&&, ||, ==, !=, >, < 등 연산 기호를 사용할 수 있다.
#if defined
#ifdef와 동일하게 사용 가능하다.
&&, ||, ==, !=, >, < 등 연산 기호를 사용할 수 있어서 다중 조건에 사용 가능하다.
#error
error 메세지를 출력한다.
어떤 장치를 장착할 지 알수 없는 초기 개발 단계에서 초기화 코드를 작성할 때 쓰인다고 한다.
#include <stdio.h>
#define DEV1
#define MODE 3
#if defined DEV1 && MODE == 3
int main()
{
printf("success!\n");
}
#elif !defined(DEV1)
#error no device
#else
#error incorrect mode
#endif
Header Guard
헤더 파일에서 중복으로 포함되는 것을 방지하기 위한 기법이다.
조건부 컴파일 전처리기 지시자로 헤더 파일이 중복으로 포함되는 것을 방지할 수 있다.
방법 1 - #pragma once
간단하고 사용하기 쉬운 장점이 있다.
사실 현재 대부분의 컴파일러가 지원한다.
하지만 방법 2에 비해서 잘 사용하지 않는다. 그 이유는
- 방법 2인 #ifndef가 gcc 표준이다 (gcc ver3.4 이전 버전에서 지원 x)
- 같은 파일이 여러 경로에 있을 경우에 컴파일러가 다른 파일로 인식해서 중복 포함
자바스크립트에서 ; 를 계속 포함하듯 gcc가 워낙 메이저하다보니 잘 사용이 안되는 것 같다.
#pragma once
// 헤더 파일 내용
#include <stdio.h>
void func1();
방법2 - #ifndef ~ #define ~ #endif
해당 이름의 매크로가 없을 경우 해당 이름의 매크로를 정의하고 헤더파일을 작성하는 방법이다.
해당 헤더 파일을 다시 부를 경우 해당 이름의 매크로가 있어서 생략되게 된다.
#ifndef HEADER_FILE_H
#define HEADER_FILE_H
// 헤더 파일 내용
#include <stdio.h>
void func1();
#endif // !
'C language' 카테고리의 다른 글
변수 키워드 const, volatile (1) | 2024.12.14 |
---|---|
변수 키워드 static과 extern (1) | 2024.12.14 |
c 구조체, 유니온, typedef, 패딩, 비트필드 (0) | 2024.12.13 |
고정길이 정수 - stdint.h (1) | 2024.12.13 |
포인터와 문자열 char v[4] = "ABC" ; vs const char* v = "ABC";는 어떻게 다를까? (0) | 2024.12.12 |