0

c89 gcc 4.7.4

我只是在试验这样的宏:

#define LOG_INFO_1(fmt, ...) printf(fmt, __VA_ARGS__)
#define LOG_INFO_2(...) printf(__VA_ARGS__)

并像这样使用:

LOG_INFO_1("%s:%d", __func__, __LINE__);
LOG_INFO_2("%s:%d", __func__, __LINE__);

输出给出完全相同的格式。我只是想知道fmt在我的第一个宏中使用参数有什么好处?它似乎并不真正需要。我怎么能利用它?

4

3 回答 3

5

指定第一个参数fmt对编译器/计算机没有影响。

但是,我认为这对可能使用您的代码的其他程序员有很大的不同。

查看LOG_INFO_1(fmt, ...),我看到一个强烈的提示,即该宏采用 printf 样式的格式字符串,后面带有附加参数。

看着LOG_INFO_2(...),我不知道应该传递什么参数,或者以什么顺序传递。也许第一个参数应该是RFC 5424严重性代码?也许它应该是要写入的输出流?宏中没有任何内容暗示答案。

我认为你应该通过尽可能多地指定来让追随你的程序员更容易工作,并且...只在绝对必要的情况下留下模棱两可的地方。

于 2012-10-23T17:10:47.583 回答
2

对于宏,您使用哪种变体并不重要。预处理器将从两个宏生成相同的 C 代码。


对于可变参数函数,至少需要定义一个参数。

所以

void foo(const char * fmt, ...);

会编译,而

void bar(...);

不会。

于 2012-10-23T17:06:10.783 回答
1

看看ACE_DEBUG/Log_Msg。ACE(自适应通信环境)是一个成熟的 C++ 网络框架。他们以类似的方式使用宏和可变参数实现了线程安全的日志架构。

于 2012-10-23T17:18:44.463 回答