【问题标题】:Ignore empty variadic params忽略空的可变参数
【发布时间】:2013-01-02 13:17:23
【问题描述】:

当所有参数都传递给 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;
}

但是如果我想在格式中调用不带参数的 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" , ,);

最后加上,,

【问题讨论】:

  • 您是否尝试过运行预处理器并查看输出? GCC 中的 cppgcc -E
  • @effeffe 是的,请参阅使用 cpp 输出编辑
  • 您可能想要使用, ## __VA_ARGS__,而不是, __VA_ARGS__
  • @DavidRF 我尝试用gcc file.c -std=c99 编译您粘贴的代码(## 前置到__VA_ARGS__),但我没有收到任何警告。使用-pedantic 我得到相同的警告(关于要使用的其余参数);但它编译得很好......
  • @DavidRF 忽略这里的警告实际上是安全的。

标签: c c-preprocessor variadic-macros


【解决方案1】:

为了使预处理器正常工作,您必须使用串联“运算符”(在此上下文中具有特殊含义):而不是

, __VA_ARGS__

, ## __VA_ARGS__

它应该按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    相关资源
    最近更新 更多