1

我有一个这样的宏。

#define TRACE(fmt, ...) trace(__FILE__, __FUNCTION__, fmt, __VA_ARGS__);

但有时我不想提供格式字符串。像 TRACE() 这样的东西应该做。现在,我用

TRACE("%s", "") 

有什么方法可以简化吗?

4

2 回答 2

3

关于什么?

#define TRACE(...) trace(__FILE__, __FUNCTION__, __VA_ARGS__)


TRACE("");

...省略号必须替换至少一个参数,因此如果您使用该表单,TRACE(fmt, ...)则在调用时不能使用单个参数TRACE

由于这个原因,表单TRACE(...)通常比表单更受欢迎TRACE(fmt, ...)

另请注意,我;在您的宏定义中删除了。将它放在定义中是一种不好的做法,必须;将其放在宏调用之后。如果您想了解更多信息,请参阅此 CERT 文档:PRE11-C。不要用分号结束宏定义

于 2013-07-02T19:25:48.813 回答
1

相邻的字符串文字合并为一个字符串。所以以下应该工作

#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 代码流中的常用函数调用约定。)

于 2013-07-02T20:10:38.073 回答