我有一个使用来打印输出的函数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") \ ^
main.c:7:5:警告:函数'X'的隐式声明[-Wimplicit-function-declaration]
嗯,是。在STUFF
出现宏的第18行,首先将其扩展为
TABLE
,然后重新扫描。TABLE
被定义为宏,它也被扩展,导致
X("abc", "123", "ddd") X("def", "456", "aaa") X("ghi", "789", "ddd")
,那么该重新扫描。但X
在没有定义为在该点的宏(或其他东西),因为你以前undef
INED它。剩下的代码类似于对未知函数的三个调用,而没有任何类型的运算符或分隔符。无效。
您的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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句