Summry
전처리(preprocessing)란 컴파일 이전에 미리 처리되는 문장으로 전처리에 사용되는 작업 지시어를 전처리 지시어(preprocessing directive)라 한다.
전처리 지시어 종류
- 파일처리
- #include
- 형태 정의
- #define, #undef
- 조건 처리
- #if, #else, #elif, #endif, #ifdef, #ifndef
- 에러 처리
- #error
- 디버깅
- #line
- 컴파일 옵션 처리
- #pragma
본 문서에서는 조건 처리에 대한 전처리 지시어를 정리한다.
send me email if you have any questions.
if 와 #if 비교
- 전처리 지시어의 경우 #endif 이렇게 닫아주는 지시어가 있다.
- 일반 조건문의 경우 괄호로 블락을 구분하지만 전처리기는 괄호를 사용하지 않는다.
- 일반 if 조건문은 false 인 경우, 실행이 되지 않을 뿐 컴파일은 되지만 #if 가 0 이라면 컴파일 자체가 되지 않는다.
아래는 예제이다.
#include <stdio.h>
int main()
{
if (0){ //괄호로 범위 지정
printf("실행되지는 않지만 컴파일은 됨\n");
}
#if 0
printf("컴파일 자체가 안됨\n");
#endif
return 0;
}
#if 와 #ifdef 비교
#ifdef 의 def 는 define 의 약자이다. 즉, #if가 ‘만약~라면’ 이라는 뜻이라면 #ifdef는 ‘만약 ~가 정의되어 있다면’을 의미한다.
또한 ifndef는 if not define 으로 #ifdef 의 반대로 생각하면 된다.
아래는 예제이다.
#include <stdio.h>
#define A 0
int main()
{
#ifdef A
printf("A is defined\n");
#endif
//-----------------
#if A
print("A is True\n");
#else
printf("A is False\n");
#endif
return 0;
}
실행 결과는 A 가 0의 값을 가짐에도 불구하고 A 가 정의되어 있기 때문에 “A is defined” 가 출력되게 된다.
#if 조건을 분기하는 #elif
#ifdef는 정의되어 있냐 정의되어 있지 않냐 이분법적으로만 나누기 때문에 #elif를 사용할 수 없지만, #if는 #elif를 사용할 수 있다.
아래는 예제이다.
#include <stdio.h>
#define NUM 2
int main(void)
{
#if NUM==1
printf("NUM is 1\n");
#elif NUM==2
printf("NUM is 2\n");
#elif NUM==3
printf("NUM is 3\n");
#else
printf("NUM is %d\n", NUM);
#endif
return 0;
}
실행 결과는 “NUM is 2” 가 출력되게 된다.
Reference
#if, #ifdef, #elif, #else, #endif 전처리기 지시어 알아보기. #if와 #ifdef 차이점이 무엇일까. 조건부 컴파일 매크로 - IT 양햄찌
C언어 전처리기(#if, #else, #endif, #ifdef, #ifndef, #undef) - SLL
PREVIOUSasmlinkage
NEXTLinux discriptor