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

时间:2015-09-17 20:26:44

标签: c macros variadic-functions

我的代码中有各种各样的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 :(得分: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

答案 1 :(得分:4)

我建议使用:

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

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

DEBUG("foo");

了。

对于某些编译器,有一些解决方法允许空__VA_ARGS__喜欢

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

在gcc中(感谢M. Oehm)。

答案 2 :(得分:0)

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

如果你有一个宏

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

然后在代码中

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

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

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