繁体   English   中英

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

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

我可以看到 三个三个 问题:

  1. 您将在同一范围内有多个msg变量。
  2. 您缺少逗号(@Ninetainedo指出)。
  3. 您对格式化的字符串不执行任何操作。

我希望声明一个全局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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM