首页 文章

如何修改多参数宏的参数?

提问于
浏览
2

我在我的代码中定义了各种printf宏:

#define DEBUG(...) printf(__VA_ARGS__)

这很好用:

DEBUG("Hello %d",1);

会是一样的

printf("Hello %d",1);

现在我可以让我的宏也编辑传入的args,比如在第一个参数的末尾添加一个\ n吗?即以便

DEBUG("Hello %d",1);

变成

printf("Hello %d\n",1);

3 回答

  • 0

    我建议使用:

    #define DEBUG(fmt, ...) printf(fmt "\n", __VA_ARGS__)
    

    缺点是您必须至少有一个非格式字符串参数,即您不能将宏用作:

    DEBUG("foo");
    

    了 .

    对于某些编译器,有一些解决办法允许空 __VA_ARGS__ 之类的

    #define DEBUG(fmt, ...) printf(fmt "\n", ##__VA_ARGS__)
    

    在gcc(感谢M. Oehm) .

  • 4

    如果您希望 \n 始终在决赛中,您可以再添加一个 printf 语句:

    #define DEBUG(...) printf(__VA_ARGS__); printf("\n")
    ...
    DEBUG("hello %d", 1);
    DEBUG("hello %d", 1);
    

    输出:

    你好1你好1

    正如其他人所指出的那样,在这种情况下,这将无法正常工作:

    if (cond) 
        DEBUG("Blah")
    

    所以你必须这样定义宏:

    #define DEBUG(...) do { printf(__VA_ARGS__); printf("\n"); } while(0)
    

    感谢M. Oehm和undur_gongor

  • 4

    如果您知道第一个参数始终是字符串文字,则可以使用字符串文字连接执行此操作 .

    如果你有一个宏

    #define EXAMPLE(A,B) \
    printf("%s", A B)
    

    然后在代码中

    EXAMPLE("foo ", "bar\n");
    

    会是一样的

    printf("%s", "foo bar\n");
    

    (由于您没有显示完整的代码,我认为您可以根据您的情况进行调整)

相关问题