Skip to content

조건부 컴파일과 전처리기

아는거 씨부리기#

  • #define, #ifdef, #ifndef, #undef => 헤더가드 만들때 사용가능. 같은 헤더파일을 여러 파일이 include할 때 생기는 코드의 중복을 방지할 수 있음. (사실 #pragma once를 써도 되기는 함 gcc.gnu.org)
// myheader.h
#ifndef __MY_HEADER
#define __MY_HEADER
int do_something(void);
#endif
// dep1.h  
#include "myheader.h"  
...
// dep2.h  
#include "myheader.h"  
...  
// main.c  
#include "dep1.h"  
#include "dep2.h"  

int main(void) {  
    do_something();  
}  
  • ## 토큰 연결 연산자(Token-pasting operator)를 사용하면 두 개의 토큰을 하나로 연결할 수 있다. wiki
#define DECLARE_STRUCT_TYPE(name) typedef struct name##_s name##_t

DECLARE_STRUCT_TYPE(g_object); // 출력 결과는 typedef struct g_object_s g_object_t;
  • # 문자열화 연산자(Stringizing operator)를 사용하면 인자로 들어온 파라메터를 문자열 그대로 반환한다. 이럴때 사용할 수 있다.
#define PRINT_D(x) printf("%s: %d\n", (#x), (int)(x))
#define PRINT_L(x) printf("%s: %ld\n", (#x), (long)(x))

x = 10
PRINT_D(x); // x: 10