함수파라메터에 따라 상이한 함수를 호출하는 것을 C-preprocess를 통해서 해 보려 한다.

3개의 c함수를 다음과 같이 정의하였다고 가정한다.
   a_func1(int parm1);
   a_func2(int parm1, int parm2);
   a_func3(int parm1, int parm2, int parm3)

그리고 CALL_FUNC이라는 매크로를 정의하여 다음과 같이 사용하고 싶다.

CALL_FUNC(a_func,a)   ----> a_func1(a)     // 파라메터가 1개이기때문에 a_func1을 호출하였다.
CALL_FUNC(a_func,b,c)  ---> a_func2(b,c)   // 파라메터가 2개이기때문에 a_func2을 호출하였다.
CALL_FUNC(a_func,d,e,f) --> a_func3(d,e,f) // 파라메터가 3개이기때문에 a_func3을 호출하였다.

우선 빌트인 매크로 중에 두개의 문자열을 이어 주는 것이 있는 데, 바로 '##'이다.
예를 들면
macro_param_count_10.png


우선 gcc-extension의 variadic macro call을 사용해서 DEBUG_MSG()라는 것을 구현해 보자.
하고자 하는 것은 DEBUG매크로에 따라 debug-message를 보여주거나 또는 보여지지않게 하는 것이다.

macro_param_count_11.png

variadic 매크로라는 것을 표시하기 위해서는 eclipse '...'를 사용한다.
이 (variable) list를 매크로몸체에서 참조하기 위해서는 '##args'를 사용한다.
'gcc -E'를 사용해서 c언어파일을 다음과 같이 전처리할 수 있다.
macro_param_count_12.png
위에서 보듯이 'j1, j2', 'k'와 같은 varible parameter list를 치환해준다.
','가 없는 null-list도 잘 처리함을 볼 수 있다.

위의 매크로에 '#ifdef'를 덧붙이면 우리가 원하는 DEBUG를 위한 매크로가 된다.
macro_param_count_13.png

이제 FUNC_NUMARGS를 정의하는 데 이것은 항상 4번째의 파라미터로 치환된다.
이것을 이용하면 매크로로 전달된 파라메터의 갯수를 알수 있다.

  #define _FUNC_NUMARGS(a,b,c,d,...) d
  #define FUNC_NUMARGS(...) _FUNC_NUMARGS(__VA_ARGS__,3,2,1,0)
macro_param_count_14.png
variable-list의 1개씩 늘어날때마다 FUNC_NUMARGS의 "3,2,1,0"는 오른쪽으로 밀리면서 전달된 매크로의 갯수를
알 수 있다.
이 매크로를 이용하여 CALL_FUNC(a_func,b,c)가 호출될 때 파라메터 'b,c'의 갯수라 2라는 것을 알 수 있으며
a_func과 2를 이어서 a_func2를 만든 후 파라미터 리스트 '(b,c)'를 덧붙여서 원하는 결과를 얻을 수 있다.
macro_param_count_15.png