당신은 가변 인자 매크로와 함께 일을하기 위해 다양한 재귀 매크로 기술을 사용할 수 있습니다 그러나, 유지 보수, 다양성, 구현의 용이성을 위해,이 순간에 최선의 선택이 될 것으로 보인다. 예를 들어, 당신은 가변 인자 매크로 인수의 수를 세는 NUM_ARGS
매크로를 정의 할 수 있습니다 : 다음과
#define _NUM_ARGS(X100, X99, X98, X97, X96, X95, X94, X93, X92, X91, X90, X89, X88, X87, X86, X85, X84, X83, X82, X81, X80, X79, X78, X77, X76, X75, X74, X73, X72, X71, X70, X69, X68, X67, X66, X65, X64, X63, X62, X61, X60, X59, X58, X57, X56, X55, X54, X53, X52, X51, X50, X49, X48, X47, X46, X45, X44, X43, X42, X41, X40, X39, X38, X37, X36, X35, X34, X33, X32, X31, X30, X29, X28, X27, X26, X25, X24, X23, X22, X21, X20, X19, X18, X17, X16, X15, X14, X13, X12, X11, X10, X9, X8, X7, X6, X5, X4, X3, X2, X1, N, ...) N
#define NUM_ARGS(...) _NUM_ARGS(__VA_ARGS__, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
을, 당신은리스트의 각 요소에 대해 다른 매크로를 확장되는 FOREACH
매크로를 작성할 수 있습니다
#define EXPAND(X) X
#define FIRSTARG(X, ...) (X)
#define RESTARGS(X, ...) (__VA_ARGS__)
#define FOREACH(MACRO, LIST) FOREACH_(NUM_ARGS LIST, MACRO, LIST)
#define FOREACH_(N, M, LIST) FOREACH__(N, M, LIST)
#define FOREACH__(N, M, LIST) FOREACH_##N(M, LIST)
#define FOREACH_1(M, LIST) M LIST
#define FOREACH_2(M, LIST) EXPAND(M FIRSTARG LIST) FOREACH_1(M, RESTARGS LIST)
#define FOREACH_3(M, LIST) EXPAND(M FIRSTARG LIST) FOREACH_2(M, RESTARGS LIST)
:
차례로 당신이 인수의 각을 stringifies 매크로를 정의 할 수 있도록한다 : 거의 다, 그러나 아이디어는 t을 완화입니다
#define STRINGIFY(X) #X
#define MY_VARIADIC_MACRO(...) FOREACH(STRINGIFY, (__VA_ARGS__))
또 다른 멋진 기능은 목록의 인수가 끝나는 위치를 결정하기 위해 매크로를 통해 전달되는 정보 유형을 보유하지 않고도 인수의 수를 쉽게 찾을 수 있다는 것입니다. – Hazok
흥미 롭습니다. 그러나 이것을 해결책으로 표시하기 전에이를 해결 한 실제 코드를 게시하십시오. 나는 그것이 다른 사람들에게 유용 할 것이라고 확신한다. – Tim
@Tim Will은 이미 간단한 사례를 테스트했으며 더 좋은 예를 만들 것입니다 ... 마감일을 지키고 내일 (2011/11/05) 또는 다음 날 중 하나에 게시합니다. – Hazok