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
Posted by Jason Ryu
,

Utilities newly added into my Mac OS X Mountain Lion.



1. [FREE] PDF Viewer, SKIM (http://skim-app.sourceforge.net/)


2. [US$70] Programming Editor, Sublime Text, for Developers.(http://www.sublimetext.com/)

: Try it first, and then let's get it or not!!

3. [FREE] Powerful Terminal, iTerm2.(http://www.iterm2.com/#/section/home)


4. [FREE] Enhanced you touches, Better Touch Tool.(http://www.boastr.de/)


5. [FREE] My Battery status, CoconutBattery.(http://www.coconut-flavour.com/coconutbattery/)


6. [FREE] ScreenCapture, Monosnap.(http://monosnap.com/welcome)



 All other information about useful apps are available at "http://macnews.tistory.com/533".


Posted by Jason Ryu
,