gpt4 book ai didi

使用其他宏作为参数调用 C 宏

转载 作者:行者123 更新时间:2023-11-30 16:50:20 25 4
gpt4 key购买 nike

我在尝试将宏常量作为参数传递给宏函数时遇到问题。

考虑以下代码 -

#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() 宏时使用它们。

最佳答案

宏的一个问题是它在代码块中的随机位置声明了一个变量,这是 C89 不允许的:您只能在代码块的顶部声明变量。即使使用 C99 编译器,问题也不会消失,因为现在您可以在同一作用域中引入多个同名声明,这是被禁止的。

您可以使用do/while(0) trick解决这个问题:

#define LOG(lvl,mod,fmt,...) do {\
char msg[256] = {0}; \
snprintf(msg, 256, "%s: %d: "fmt,mod,lvl,##__VA_ARGS__) \
} while(0)

关于使用其他宏作为参数调用 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42228623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com