조건부 컴파일과 전처리기
아는거 씨부리기
#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