C/C++ 宏中的逗号传递给另一个宏
Comma in C/C++ macro passed to another macro
我有这些宏,它们在 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"
正常吗?
以下调用:
log(log_params, "testing %d", 4)
使用三个 实际 参数调用类似函数的宏 log
。在参数为 "passed" 到宏之前,它们的替换没有被解析。换句话说,即使 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)
这解决了我的问题
所以我现在正在使用
#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__))
我有这些宏,它们在 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"
正常吗?
以下调用:
log(log_params, "testing %d", 4)
使用三个 实际 参数调用类似函数的宏 log
。在参数为 "passed" 到宏之前,它们的替换没有被解析。换句话说,即使 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)
这解决了我的问题
所以我现在正在使用
#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__))