将0附加到不完整的宏参数列表

Gil*_*man 7 c macros c-preprocessor

我使用了以下几个C预处理器宏:

#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4
#define FILL_PARAMS(...) TAKE4(__VA_ARGS__, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

FILL_PARAMS使用1,2或3个参数调用时,后面的(未指定的)会按预期变为0,但是当不给出参数时会出现错误.

有没有办法添加对无参数的支持?

澄清:
目前支持以下用途:

FILL_PARAMS(1)         // => 1, 0, 0, 0
FILL_PARAMS(1, 2)      // => 1, 2, 0, 0
FILL_PARAMS(1, 2, 3)   // => 1, 2, 3, 0
Run Code Online (Sandbox Code Playgroud)

我想添加对以下边缘情况的支持:

FILL_PARAMS()          // => 0, 0, 0, 0
Run Code Online (Sandbox Code Playgroud)

欢迎提供帮助.

Gil*_*man 2

找到了一个 hack-ish 解决方案:

#define TAKE4(a1, a2, a3, a4, ...) a1, a2, a3, a4
#define FILL_PARAMS(...) TAKE4( __VA_ARGS__ + 0, 0, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

这至少适用于以下测试用例。

int i = 120;
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS());
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(i));
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1));
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1, 2));
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1, 2, 3));
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1, 2, 3, 4));
printf("%d\t%d\t%d\t%d\n", FILL_PARAMS(1, 2, 3, i));
Run Code Online (Sandbox Code Playgroud)