살군의 보조기억 장치

Another memory device…

Variadic Macros

leave a comment »

전에 살펴본 CV_TEST_MAIN() 의 정의를 살펴보면 첫 라인에 바로 나오는 코드:

#define CV_TEST_MAIN(resourcesubdir, ...) \

처음부터 이상한 문법을 사용한다. 찾아봤다. Variadic macro 라는 요상한 C preprocess 표준이 있다.

Variable-argument macros were introduced in 1999 in the ISO/IEC 9899:1999 (C99) revision of the C language standard, and in 2011 in ISO/IEC 14882:2011 (C++11) revision of the C++ language standard.

C99 와 C++11 에서 표준으로 적용된 거랜다.

Variadic Macro 라고 불리는 이 문법은, 매크로에서 정의한 명시적인 argument 이후의 모든 variable argument 의 token(컴마”,”도 포함) 을 __VA_ARGS__ 에 저장한다. __VA_ARGS__ 는 매크로 본문에서 사용할 수 있으며 아래의 예제와 같이 컴파일 시에 원래의 variable argument 로 변환된다.

#define eprintf(...) fprintf (stderr, __VA_ARGS__)      // eprintf() 정의
...
eprintf ("%s:%d: ", input_file, lineno)                 // 코드에서 eprintf() 사용
fprintf (stderr, "%s:%d: ", input_file, lineno)         // 컴파일 시 변경된 코드

Variadic macro 는 “…” 대신 “argumentName…” 와 같이 좀 더 구체적인 이름으로 사용할 수 있다. 이 경우에는 __VA_ARGS__ 를 사용할 수 없다.

 #define eprintf(args...) fprintf (stderr, args)    // ... 대신 args... 사용 이때는 __VA_ARGS__ 를 사용할 수 없다

또 다른 사용 방법으로 명시적인 argument 와 같이 variadic macro 를 사용할 수 있다. 아래 예제는 명시적인 argument 인 format 과 … 를 같이 사용하는 것을 보여준다. C99 표준에서는 명시적인 argument 와 variadic macro 를 동시에 사용할 경우, 적어도 하나 이상의 variable argument 를 전달해줘야 한다. 그렇지 않을 경우 에러가 발생한다. 이건 좀 확인이 필요하겠다.

#define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__)

eprintf("success!\n", );
fprintf(stderr, "success!\n", );

Visual Studio 의 경우, trailing comma 문제를 컴파일러에서 알아서 해결해주지만 gcc 는 ##__VAR_ARGS__ 를 이용해서 처리한다. 표준 문법이 아니므로 다른 플랫폼으로 이식을 생각할 경우 사용하지 않는 것이 좋다.

참고

Advertisements

Written by gomiski

2014/02/06 at 12:03 pm

Posted in C++, Lecture, opencv

Tagged with , , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: