我有一个这样的宏。
#define TRACE(fmt, ...) trace(__FILE__, __FUNCTION__, fmt, __VA_ARGS__);
但有时我不想提供格式字符串。像 TRACE() 这样的东西应该做。现在,我用
TRACE("%s", "")
有什么方法可以简化吗?
我有一个这样的宏。
#define TRACE(fmt, ...) trace(__FILE__, __FUNCTION__, fmt, __VA_ARGS__);
但有时我不想提供格式字符串。像 TRACE() 这样的东西应该做。现在,我用
TRACE("%s", "")
有什么方法可以简化吗?
关于什么?
#define TRACE(...) trace(__FILE__, __FUNCTION__, __VA_ARGS__)
TRACE("");
...
省略号必须替换至少一个参数,因此如果您使用该表单,TRACE(fmt, ...)
则在调用时不能使用单个参数TRACE
。
由于这个原因,表单TRACE(...)
通常比表单更受欢迎TRACE(fmt, ...)
。
另请注意,我;
在您的宏定义中删除了。将它放在定义中是一种不好的做法,必须;
将其放在宏调用之后。如果您想了解更多信息,请参阅此 CERT 文档:PRE11-C。不要用分号结束宏定义
相邻的字符串文字合并为一个字符串。所以以下应该工作
#define TRACE(...) trace(__FILE__, __func__, "" __VA_ARGS__)
TRACE();
TRACE("hello");
TRACE("integer %d", 42);
将导致相当于
trace(__FILE__, __func__, "");
trace(__FILE__, __func__, "hello");
trace(__FILE__, __func__, "integer %d", 42);
唯一的限制是第一个参数(如果有的话)必须是字符串文字。另一个char*
对象不起作用。
(注意使用__func__
这个是 C 标准中函数名称的预定义标识符。并且;
宏中缺少 以更好地适应普通 C 代码流中的常用函数调用约定。)