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
参数有什么好处?它似乎并不是真正需要的。我怎么能利用它?
非常感谢任何建议,
答案 0 :(得分:5)
指定第一个参数是fmt
对编译器/计算机没有任何影响。
但是,我认为这对可能使用您的代码的其他程序员来说有很大的不同。
看一下LOG_INFO_1(fmt, ...)
,我看到一个强烈暗示,这个宏采用了带有附加参数的printf样式格式字符串。
查看LOG_INFO_2(...)
,我不知道应该传递什么参数,或者以什么顺序传递。也许第一个参数应该是RFC 5424严重性代码?也许应该是要写入的输出流?宏中没有任何内容暗示答案。
我认为你应该通过尽可能多地指定来帮助那些追随你的程序员,并且只在绝对必要的地方留下诸如...
这样的含糊之处。
答案 1 :(得分:2)
对于宏,使用哪种变体并不重要。预处理器将从两个宏中生成相同的C代码。
对于可变函数,至少需要定义一个参数。
所以
void foo(const char * fmt, ...);
会编译,而
void bar(...);
不会。
答案 2 :(得分:1)
看看ACE_DEBUG/Log_Msg。 ACE(自适应通信环境)是一个已建立的网络c ++框架。他们以类似的方式使用宏和可变参数实现了一个线程安全的日志记录体系结构。