조건부 컴파일

유명현·2022년 1월 2일
0

조건부 컴파일은 특정 조건에 따라 컴파일 여부를 결정한다.

// 매크로가 정의되어 있을 때 컴파일          // DEBUG 매크로가 정의되어 있을 때 컴파일
#ifdef 매크로                              #ifdef DEBUG
코드                                           printf("Debug\n");
#endif                                     #endif

// 매크로가 정의되어 있지 않을 때 컴파일     // DEBUG 매크로가 정의되어 있지 않을 때 컴파일
#ifndef 매크로                             #ifndef DEBUG
코드                                           printf("Hello, world!\n");
#endif                                     #endif

// 값 또는 식이 참일 때 컴파일              // DEBUG_LEVEL이 2 이상일 때 컴파일
#if 값 또는 식                             #if DEBUG_LEVEL >= 2
코드                                           printf("Debug Level 2\n");
#endif                                    #endif

                                          // 조건이 항상 거짓이므로 컴파일 하지 않음
                                          #if 0
                                              printf("0\n");
                                          #endif

                                          // 조건이 항상 참이므로 컴파일함
                                          #if 1
                                              printf("1\n");
                                          #endif
                                          
                                          
#### // 매크로가 정의되어 있을 때 컴파일. 


// !, &&, ||로 논리 연산 가능             // DEBUG 또는 TEST가 정의되어 있을 때 컴파일
#if defined 매크로                       #if defined DEBUG || defined TEST
코드                                         printf("Debug\n");
#endif                                   #endif

                                         // DEBUG가 정의되어 있으면서 
                                         // VERSION_10이 정의되어 있지 않을 때 컴파일
                                         #if defined (DEBUG) && !defined (VERSION_10)
                                             printf("Debug\n");
                                         #endif

// if, elif, else로 조건부 컴파일         // DEBUG_LEVEL의 값에 따라 컴파일
#if 조건식                               #if DEBUG_LEVEL == 1
코드                                         printf("Debug Level 1\n");
#elif 조건식                             #elif DEBUG_LEVEL == 2
코드                                         printf("Debug Level 2\n");
#else                                    #else
코드                                         printf("Hello, world!\n");
#endif                                   #endif

// if, elif, else로 조건부 컴파일         // PS2, USB 정의 여부에 따라 컴파일
#ifdef 매크로                            #ifdef PS2
코드                                         printf("PS2\n");
#elif defined 매크로                     #elif defined USB
코드                                         printf("USB\n");
#else                                    #else
코드                                         printf("지원하지 않는 장치입니다.\n");
#endif                                   #endif

위와 같이 조건부 컴파일을 사용할 수 있다.

또한 헤더파일을 여러소스에서 사용하는 경우 컴파일 에러가 발생하는데 컴파일 과정에서 각 소스파일에서 같은 헤더파일을 정의하기 때문에 충돌이 나기 때문이다.

아래와 같이 작성하며 이 문제를 해결할 수 있다.

#ifndef 매크로A // 매크로A가 정의되어 있지 않다면  #ifndef DATA_H // DATA_H가 정의되어 있지 않다면
#define 매크로A // 매크로A 매크로 정의            #define DATA_H //  DATA_H 정의

// 구조체, 공용체, 열거형 등 정의                 typedef struct _DATA { // 구조체 _DATA 정의
                                                    int a;
#endif          // #ifndef 매크로A 끝                int b;
                                                } DATA;

                                                #endif         // #ifndef DATA_H 끝
profile
기억보다 기록을

0개의 댓글