【发布时间】:2020-07-07 03:08:47
【问题描述】:
我有一个消息传递函数,它接受可变数量的参数,因为它以与 printf 相同的方式支持字符串格式化。然后我的计划是使用单个 #define 定义消息代码和消息,并能够通过将单个参数传递给该函数来调用该函数。
这是消息宏:
#define MSG(a, b, ...) message(__FILE__, __LINE__, a, b, __VA_ARGS__);
这里是一个消息代码和字符串定义的例子:
#define MSG_INIT 0000,"%s INITIALIZED SUCCESSFULLY"
当我尝试以以下形式拨打电话时出现问题:
MSG(MSG_INIT);
我的 IDE 出现如下错误:
'Expands to message("file.c", 1, 0000, "INITIALIZED SUCCESSFULLY",);
最后一个“,”是导致问题的原因。
我期待看到:
'Expands to message("file.c", 1, 0000, "INITIALIZED SUCCESSFULLY");
如果我将调用更改为:
MSG(MSG_INIT,NULL);
一切都很好,但我宁愿不传递 NULL,因为首先定义 MSG_INIT 的目的是传递更少的参数。有些消息使用了__VA_ARGS__(例如:#define MSG_CONNECT 0001,"CONNECTION TO [%s] ESTABLISHED" 与匹配的调用MSG(MSG_CONEST, server_ip);),所以摆脱它不是一种选择。我只是在寻找解决此问题的最佳方法,我知道很多人建议远离预处理器,但这是我想到的最佳解决方案。
【问题讨论】:
-
看
__VA_OPT__(,) -
另一个问题是,如果你这样做
#define MSG_INIT 0000, "%s INITIALIZED SUCCESSFULLY",那么 MSG_INIT 只是一个参数。所以也许你需要#define MSG(...) message(__FILE__, __LINE__, __VA_ARGS__)
标签: macros c-preprocessor