문자열 조작
#define SAY(x) printf(#x)
SAY(Hello, world!);
와 같이 식별자 앞에 # 를 붙이게 되면 자동으로 “x” 와 같이 “”로 둘러 싸 준다.
결과적으로
printf(“Hello, world!”);
로 대치될 것이다.
문자열 결합
## 는 두 개의 문자열을 결합해 준다.
#define Print(x) Print ## x
와 같이 된 경우
Print(One) 을 사용하면 PrintOne 이라는 문자열로 대치되고 Print(Two) 는 PrintTwo 라는 문자열로 대치된다.
잘 사용하면 아주 유용한 기능이 된다.
ASSERT()
대부분의 컴파일러는 ASSERT() 매크로를 가지고 있다. 여기서는 직접 하나 만들어 보자.
#ifndef DEBUG
#define ASSERT(x)
#else
#define ASSERT(x) \
if ( ! (x) ) \
{ \
printf(#x); \
printf(“ is NULL on line %d in file %s”, __LINE__, __FILE__); \
}
#endif
이 코드의 위에
#define DEBUG
한 줄 포함하면
#define ASSERT(x)
로 아무 일도 하지 않고 DEBUG가 정의되지 않으면 그 아래 함수가 정의된다.
즉, 디버그때만 코드가 생성되고 릴리즈시에는 코드가 생성되지 않게 할 수 있는 것이다.
여러 줄이 필요할 때는 \ 가 사용되었다는 것에 유의하자. 또한 내장 매크로인 __LINE__ 이나 __FILE__ 은
다음에 설명한다.
내장 매크로
컴파일 시에 컴파일러가 미리 정의하고 있는 매크로들이 있다.
각각 오른 쪽에 있는 내용으로 대치된다.
__DATE__ : 컴파일하는 날짜
__TIME__ : 컴파일하는 시간
__LINE__ : 현재 컴파일하고 있는 줄 번호
__FILE__ : 현재 컴파일하고 있는 파일의 이름
#error
컴파일러는 이 명령을 만나게 되면 해당 메지시를 출력하고 컴파일을 중지한다.
C++ 컴파일러에서만 동작하게 하는 다음 코드를 참조하자.
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
__cplusplus 는 C++ 컴파일러일 경우에 정의되는 내장 매크로이다.
#pragma
#pragma 는 컴파일러마다 고유하게 사용할 수 있는 명령어이다. 따라서 그 문법은 컴파일러마다
다르고 그 종류도 많다.
예를 들어
#pragma once
같은 경우 위의 포함감시 기능을 컴파일러가 알아서 해 준다. 즉, 한 번 include 된 헤더 파일은 중복해서
포함되지 않도록 컴파일러가 처리해 준다.
'Language' 카테고리의 다른 글
소스 코드는 매직아이^^ (1) | 2010.11.01 |
---|