当所有参数传递给HTML_A时,此代码按预期工作:
#include <stdio.h>
#define HTML_A_fmt_void
#define HTML_A_arg_void
#define HTML_A_fmt_link(fmt, ...) " href=\""fmt"\""
#define HTML_A_arg_link(fmt, ...) ,__VA_ARGS__
#define HTML_A_fmt_text(fmt, ...) fmt
#define HTML_A_arg_text(fmt, ...) ,__VA_ARGS__
#define HTML_A(link, text) \
printf("<a" HTML_A_fmt_##link ">" HTML_A_fmt_##text "</a>\n" HTML_A_arg_##link HTML_A_arg_##text)
int main(void)
{
HTML_A(
link("%s", "http://wwww.google.com"),
text("%s", "Visit google")
);
HTML_A(
link("%s", "http://wwww.google.com"),
void
);
HTML_A(
void,
text("%s", "Visit google")
);
HTML_A(
void,
void
);
return 0;
}
但是如果我想在格式中调用没有args的HTML_A:
HTML_A(
link("http://wwww.google.com"),
text("Visit google")
);
我在gcc:
下收到此编译错误demo.c:17:1:警告:ISO C99要求使用休息参数 demo.c:在函数'main'中:
之前的预期表达式
demo.c:17:错误:在','标记
cpp返回:
printf("<a" " href=\"""http://wwww.google.com""\"" ">" "Visit google" "</a>\n" , ,);
最后有,,
。
答案 0 :(得分:3)
为了使预处理器正常工作,您必须使用串联“运算符”(在此上下文中具有特殊含义):而不是
, __VA_ARGS__
写
, ## __VA_ARGS__
它应该按预期工作。