C/C++에서 가변인자 함수를 사용하기 위해서는 어느 표준을 따라 컴파일하느냐가 중요하다.
C99 표준 이전에는 이런식이었다.
#ifdef DEBUG
#define TRACE(a) print a
#else
#define TRACE(a)
#endif /* DEBUG */
결국 사용할 때에는
TRACE(("result = %d\n", value));
위와 같이 "((", "))"를 사용하였고, 결국 printf("result = %d\n", value);라고 작성한것과 같은 결과를 만들어낸다.
gcc를 이용한다면 위의 매크로는 좀 더 간결해지긴 한다.
#define TRACE(args...) fprintf(args)
괄호를 하나만 쓰는것 빼곤 좋은점이 보이진 않는다. 더구나 "비표준"이라 다른 컴파일러에서 동작된다는 보장이 없다.
그래서 C99 표준에서 도입된 것이 가변매크로 정의방법이고, 그것이 __VA_ARGS__ 이다.
이를 이용하여 위 매크로를 만들어보면
#define TRACE(other, fmt, ...) my_function(other, fmt, ##__VA_ARGS__)
차이점은 "fmt"와 "..." 사이에 ","가 포함되어 있다는 것과 __VA_ARGS__로 대치되는것, 그리고 괄호는 하나만 사용한다는 것이다.
그리고, "##"을 사용하였는데 그건 다음과 같은 이유때문이다. 예를 들어,
TRACE(1, "one argument");
처럼 사용할 경우, 인자가 하나이므로 확장하면
my_function(1, "one argument", );
가 되어 ","가 문제를 일으킨다. 결국 "##"을 사용함으로써 이부분을 해결할 수 있다는 것이다.
많은 컴파일러들이 C99 표준을 따라주기때문에, 가변매크로를 사용하는데 지장은 없지만 여전히 C99표준을 따르지 않는 컴파일러들도 존재하고 있기때문에 주의해야 한다. 특히 Visual C++!!!
'$ SaVvY > » computer' 카테고리의 다른 글
SyncMaster TA531 with Mac OS X (1) | 2013.07.01 |
---|---|
UDP Maximum message size (0) | 2013.06.21 |
맥용 어플 추가... (0) | 2013.06.10 |
Mac에서 Office 문서 사용하기. (0) | 2012.06.13 |
IMS(IP Multimedia Subsystem) (1) | 2012.05.05 |