위 지시문들은 보통 조건부 컴파일 지시자라고 한다. #이 앞에 오는 전처리 지시자이다.
먼저 #if, #elif, #else, #endif부터 알아보면, 일반적으로 우리가 사용하는 if, else if, else와 방식이 유사하다는 것을 알 수 있다. 규칙은 #if를 사용하면 꼭 끝나는 부분에 #endif를 삽입해야 한다는 것을 숙지하자. 왜냐하면, 전처리기는 scope를 사용하지 않아서 꼭 끝을 내줘야 하기 때문이다. 이는 보통 조건부로 코드를 추가 및 제거해서 컴파일할 때 많이 사용한다.
#include <stdio.h>
#define VERSION 3
int main(void) {
#if (VERSION == 1)
printf("VERSION 1. \n");
#elif (VERSION ==2)
printf("VERSION 2. \n");
#else
printf("VERSION 3. \n");
#endif
return 0;
}
위 코드에서 #if, #elif, #else는 조건부에 참이 되는 코드만 컴파일이 된다. 다만, 전처리 지시자이므로 일반 변수로는 조건을 사용할 수 없고, 매크로로 사용이 가능하다.
다음으로 #ifdef, #ifndef, #endif이다. 앞에서 #if는 조건을 봤다면, #ifdef는 조건의 매크로가 정의만 되었있으면 컴파일한다. #ifndef는 반대로 매크로가 정의가 안되어있으면 포함된 코드를 컴파일한다. 물론 #ifdef, #ifndef도 꼭 #endif로 끝내야 한다.
#include <stdio.h>
#define TEST
int main(void) {
#ifdef TEST
printf("--테스트-- \n");
#endif
#ifndef TEST
printf("--배포-- \n");
#endif
printf("Hello World \n");
return 0;
}
이런 조건부 컴파일 지시자는 사용처가 굉장히 많다.
- 운영체제에 따라서 다르게 구분하여 코드를 컴파일하거나 버전에 따라서 컴파일할 코드를 정해줄 수 있다.
- 국가별로 다른 언어 버전의 헤더 파일을 추가해줄 수 있다.
예를 들어, 디버깅용 출력코드 등을 매번 배포용으로 할 때마다 지우던가 주석 처리하던가 해서 사용자는 보이지 않게 해야하는 번거로움이 있다. 이때, 조건부 컴파일 지시자로 확인용 코드들을 묶어놓으면 매크로 정의만 변경하면, 일괄적으로 조건부로 컴파일이 되게 해주는 역할로도 사용할 수 있다.
인용
https://responding.tistory.com/52
'Language > C' 카테고리의 다른 글
C언어 메모리 조작 (memcpy, memmove) (0) | 2023.11.16 |
---|---|
#define에 대해서 (0) | 2023.11.11 |
선언(declaration)과 정의(definition) (0) | 2023.11.05 |
구조체 (0) | 2023.11.05 |
키워드 _CRT_SEUCRE_NO_WARNINGS에 대하여 (0) | 2023.11.05 |