[英]Calling a C macro with other macros as arguments
我在尝试将宏常量作为参数传递给宏函数时遇到问题。
考虑以下代码-
#define ERROR 10
#define MAIN "Main:"
#define LOG(lvl,mod,fmt,...) \
char msg[256] = {0}; \
snprintf(msg, 256, "%s: %d: "fmt,mod,lvl,##__VA_ARGS__)
int main()
{ ....
LOG(ERROR, MAIN, "This is a log statement.\n"); // Doesn't compile
LOG(10, "Main:", "This is a log statement.\n"); // Compiles
....
}
第二条日志语句会编译,但第一条日志语句会生成以下编译错误-
error: expected `)' before ‘;’ token
error: expected primary-expression before ‘,’ token
error: expected `;' before ‘)’ token
为什么会这样呢? 我希望能够定义一组日志记录级别和模块常量,并在调用LOG()宏时使用它们。
我可以看到
三个三个
问题:
msg
变量。 我希望声明一个全局logger()
函数,该函数接受日志记录级别并使用宏来缩短对其的调用。
宏的一个问题是,它在代码块的随机位置声明了一个变量,C89不允许这样做:只允许您在块的顶部声明变量。 即使使用C99编译器,问题也不会消失,因为现在您可以在同一作用域中引入多个具有相同名称的声明,这是禁止的。
您可以使用do
/ while(0)
技巧解决此问题:
#define LOG(lvl,mod,fmt,...) do {\
char msg[256] = {0}; \
snprintf(msg, 256, "%s: %d: "fmt,mod,lvl,##__VA_ARGS__) \
} while(0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.