c - 忽略空的可变参数

标签 c c-preprocessor variadic-macros

当所有参数都传递给 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: warning: ISO C99 requires rest arguments to be used
demo.c: In function ‘main’:
demo.c:17: error: expected expression before ‘,’ token

cpp 返回:

printf("<a" " href=\"""http://wwww.google.com""\"" ">" "Visit google" "</a>\n" , ,);

,, 结尾。

最佳答案

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

, __VA_ARGS__

, ## __VA_ARGS__

它应该按预期工作。

关于c - 忽略空的可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14122774/

相关文章:

c - 在 C 中填充数组

c++ - 当#define 在 #if 中时, token "#"错误之前缺少二元运算符

c - 检测 C 宏中是否存在参数

c++ - 现代/通用方法来处理可变参数宏

c - 填充数组的机制

c - 套接字 UDP : Using Sender Info from Recvfrom() in Sendto() Fails

c - 我有一些关于如何将生成的数据保存在新字符串中的 for 循环中的问题

c++ - #include 文件派生自宏 __FILE__?

c - 运行 GCC 预处理器非 C 文件

c - 将任意数量的参数传递给函数