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

标签 c++ macros c-preprocessor variadic-macros

我有这些在 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)

关于c++ - C/C++ 宏中的逗号传递给另一个宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40005189/

相关文章:

c++ - 为了整洁起见,在另一个文件中定义前向声明的嵌套结构/类/枚举

c++ - 模板参数 : pointer to member - what should I do with it?

c++ - 如何在 C++ 的 system() 中使用#define?

c - 通过C宏检索高位字的正确方法

c - 宏等价物(C/C++)?

C++ 性能 : using declaratives Vs using declarations Vs using names directly from the library

c++ - 函数参数的继承

c - 为什么要在宏中使用 'do {} while(0)'?

c++ - 在 Visual Studio 中从可变参数计数宏为常量参数计数宏提供输入

c - 三元运算符作为 C 宏中三元运算符的操作数