C , C++, C#

[C/C++] #if #elif #endif 조건부 컴파일

vhxpffltm 2019. 12. 4. 22:47

오늘도 코드분석중 #if ... 등에 대한 내용을 보았다.

 

찾아보니 그리 어려운 내용은 아니었다. 한번 살펴보자

 

#Elif, #else및 #endif 지시문을 사용 하는 #if 지시문은 소스 파일의 부분에 대 한 컴파일을 제어 합니다.

 

라고 MS 공식 문서에 나와있다. 즉 컴파일을 할지 안할지 본다는 것이다.

 

#if를 사용했으면 마지막에 #endif를 명시해줘야한다.

 

#if를 사용할때, 비교 대상은 정수 상수여야 하며 실수나 문자열은 매크로와 비교할 수 없다. 정수값을 가지는 다른 매크로와 값을 비교하는 것은 가능하다.

 

defined 연산자로 매크로의 존재 여부를 평가할 수 있다. #if defined(MACRO) 전처리문은 #ifdef MACRO와 완전히 동일한 문장이다. 그러나 다른 조건과 함께 매크로의 존재 여부를 평가할 때는 #ifdef를 쓸 수 없으므로 defined 연산자가 따로 제공된다.

 

ex) #if defined(매크로이름)

        호출함수()

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
#include<stdio.h>
using namespace std;                             
 
 
#define DLEVEL 3
 
#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
    #define STACK   200
#else
    #define STACK   100
 
#endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
 
 
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    #define printerror()    \
    cout << "ERROR" << endl;
#else
    #define STACK 200
#endif
 
 
int main() {
    int a = STACK + 1;
    int b = SIGNAL + 1;
    printf("%d %d", a,b);
   printerror();
    return 0;
}
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

MS 공식 문서의 예제코드를 수정한 내용이다. 이 코드는 실행되지 않는다. DLEVEL 매크로 상수값을 적절하게 변경시키켜 실행된다면 이제 우리는 이 내용들을 이해한것이다. 

 

현재 코드에서 어떤 매크로가 정의되고 정의되지 않았는지 쉽게 알 수 있다.

 

Reference

https://docs.microsoft.com/ko-kr/cpp/preprocessor/hash-if-hash-elif-hash-else-and-hash-endif-directives-c-cpp?view=vs-2019

http://soen.kr/lecture/ccpp/cpp2/18-2-3.htm

 

'C , C++, C#' 카테고리의 다른 글

[C/C++] iterator (반복자)  (0) 2019.12.11
[C/C++] C++ 17 문법 unpacking(언패킹), 구조체 바인딩  (0) 2019.12.09
[C/C++] #define 매크로, #undef, size_t  (0) 2019.12.03
[C/C++] move  (0) 2019.11.14
[C/C++] 이동 생성자  (0) 2019.11.03