开发者社区 问答 正文

在另一个宏内展开X宏

我有一个使用来打印输出的函数fprintf(),并且它同时使用宏作为格式字符串和参数。由于有多个地方可以打印此信息,因此可以在仅更改一个地方的同时扩展打印范围。

我想使用相同的数据生成不同的打印,但是我希望它们使用X宏自动一起扩展,但无法编译。我不希望每次添加打印内容时都需要编辑打印内容,也不必将每个打印内容包装在ug中#define。

该程序尝试执行我想要的操作,但无法编译:

#include <stdio.h>

#define X(_a, _b, _c) \
    _a,

#define TABLE \
    X("abc", "123", "ddd") \
    X("def", "456", "aaa") \
    X("ghi", "789", "ddd") \

#define STUFF \
    TABLE

#undef X

int main()
{
    printf(" %s %s %s\n", STUFF);

    return 0;
}

(想法是STUFF打印一件事,而在另一地方,我将使用X宏的另一列TABLE创建STUFF2)

我收到以下错误:

main.c:在函数“ main”中:

main.c:7:5:警告:函数'X'的隐式声明[-Wimplicit-function-declaration]

X("abc", "123", "ddd") \

^
main.c:12:5:注意:在宏“ TABLE”的扩展中

TABLE

^~~~~
main.c:18:27:注意:在宏'STUFF'的扩展中

printf(" %s %s %s\n", STUFF);

                      ^~~~~
main.c:8:5:错误:'X'之前的预期')'

X("def", "456", "aaa") \

^

展开
收起
kun坤 2019-11-29 11:32:59 418 分享 版权
1 条回答
写回答
取消 提交回答
  • 扩展X之前未定义STUFF会导致… X不确定。

    对于X宏观工作,你必须取消定义后,在一些非宏代码有使用它(这样它可以扩展)

    解决此问题后,需要在列表中移动逗号,否则最后一个逗号将触发语法错误(error: expected ‘)’ before ‘X’)。最后一个反斜杠的相同TABLE

    #include <stdio.h>
    
    #define X(_a, _b, _c) \
        _a
    
    #define TABLE \
        X("abc", "123", "ddd"), \
        X("def", "456", "aaa"), \
        X("ghi", "789", "ddd")
    
    #define STUFF \
        TABLE
    int main()
    {
        printf(" %s %s %s\n", STUFF);
    
    #undef X
    
    
        return 0;
    }
    

    编译,执行和打印 abc def ghi

    2019-11-29 11:33:46
    赞同 展开评论
问答地址: