我有这些宏在Visual Studio 2015中生成错误。
#define log_params __FILE__, __LINE__
#define log(file, line, message, ...) _snprintf_s(nullptr, 0, 0, message, __VA_ARGS__)
现在调用它永远不会起作用
log(log_params, "testing %d", 4)
有什么想法? 我还检查了预处理器的输出,它是:
_snprintf_s(nullptr, 0, 0, 4 );
编辑1 有趣的发现
#define log(file, line, message, ...) file line
会产生这个:
"service.cpp", 164 "testing %d"
这是正常的吗?
答案 0 :(得分:3)
以下调用:
log(log_params, "testing %d", 4)
使用三个实际参数调用类似函数的宏log
。在将参数“传递”到宏之前,它们的替换不会被解决。换句话说,即使log_params
本身包含逗号,在类似函数的宏调用解析期间也不会考虑此逗号。
因此,您实际上将参数传递为:
file ---> __FILE__, __LINE__
line ---> "testing %d"
message ---> 4
替换会忽略前两个参数,最终获得:
_snprintf_s(nullptr, 0, 0, 4, __VA_ARGS__)
反过来成为(因为MSVC很乐意忽略对至少一个可变参数的要求):
_snprintf_s(nullptr, 0, 0, 4)
答案 1 :(得分:1)
这解决了我的问题
__VA_ARGS__ expansion using MSVC
所以现在我正在使用
#define EXPAND( x ) x
#define Log_printf( file_name,line, message,...) _snprintf_s(nullptr, 0,0,message, __VA_ARGS__)
#define Log(...) EXPAND (Log_printf(__VA_ARGS__))