我在尝试将宏常量作为参数传递给宏函数时遇到问题。以其他宏为参数调用C宏
考虑下面的代码 -
#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()宏时使用它们。
完全无关的(当前)的问题,而是你的'LOG'宏将不能用一个简单的'if'语句或循环体不工作明确的护腕。有一个原因是,大多数人在创建多语句宏时用'do {...} while(0)'来包围它们。 –
该宏被破坏,因为它会在同一范围内声明多个“msg”变量。 – Droppy
至于如何解决您的问题,请告诉编译器在运行预处理器后停止,以查看宏扩展创建的代码。 –