C/ c++宏传递给另一个宏的逗号

Comma in C/C++ macro passed to another macro

本文关键字:另一个 c++      更新时间:2023-10-16

我有这些在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。在将参数"传递"给宏之前,不会解决它们的替换问题。换句话说,即使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)

这就解决了我的问题

__VA_ARGS__扩展使用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__))
相关文章: