1

我有一个使用 打印输出的函数,fprintf()它对格式字符串和参数都使用宏。由于有多个位置打印此信息,这允许在仅更改一个位置的同时扩展打印。

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

这个程序试图做我想做的事,但它没有编译:

#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 打印一件事,在另一个地方我将使用称为 TABLE 的 X 宏的不同列执行 STUFF2)

我收到以下错误:

main.c:在函数'main'中:

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

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

^

main.c:12:5: 注意:在宏 'TABLE' 的扩展中</p>

TABLE

^~~~~

main.c:18:27:注意:在宏“STUFF”的扩展中</p>

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

                      ^~~~~

main.c:8:5: 错误:在 'X' 之前需要 ')'</p>

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

^
4

2 回答 2

1

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

嗯,是。在第 18 行,宏STUFF出现的地方,它首先被扩展为

TABLE

,然后重新扫描。 TABLE被定义为宏,它也被扩展,导致

X("abc", "123", "ddd") X("def", "456", "aaa") X("ghi", "789", "ddd")

,然后重新扫描。但是此时X没有定义为宏(或其他任何内容),因为您之前undef已将其定义为。这给您留下了类似于对未知函数的三个调用的代码,之间没有任何类型的运算符或分隔符。这是无效的。

您的 X 宏必须在它展开的地方适当地定义。它根本不需要在它出现在另一个宏的扩展文本中的地方定义。你似乎有那个倒退。


正如评论中所讨论的,目标是能够定义单独的宏,例如STUFF,并STUFF2扩展TABLE为彼此不同的一致结果。这与STUFF通过操纵X.

这可以通过更改 的定义来实现TABLE,使其成为一个类似函数的宏,以另一个宏名称作为参数:

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

STUFF然后,宏STUFF2可以通过选择要传递给的宏名称来控制扩展TABLE()

#define X(_a, _b, _c) _a
#define Y(_a, _b, _c) _b
#define STUFF TABLE(X)
#define STUFF2 TABLE(Y)
于 2019-11-28T20:22:48.500 回答
1
于 2019-11-28T20:16:18.370 回答