我在我的代码中定义了各种printf宏:
#define DEBUG(...) printf(__VA_ARGS__)
这很好用:
DEBUG("Hello %d",1);
会是一样的
printf("Hello %d",1);
现在我可以让我的宏也编辑传入的args,比如在第一个参数的末尾添加一个\ n吗?即以便
变成
printf("Hello %d\n",1);
我建议使用:
#define DEBUG(fmt, ...) printf(fmt "\n", __VA_ARGS__)
缺点是您必须至少有一个非格式字符串参数,即您不能将宏用作:
DEBUG("foo");
了 .
对于某些编译器,有一些解决办法允许空 __VA_ARGS__ 之类的
__VA_ARGS__
#define DEBUG(fmt, ...) printf(fmt "\n", ##__VA_ARGS__)
在gcc(感谢M. Oehm) .
如果您希望 \n 始终在决赛中,您可以再添加一个 printf 语句:
\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
如果您知道第一个参数始终是字符串文字,则可以使用字符串文字连接执行此操作 .
如果你有一个宏
#define EXAMPLE(A,B) \ printf("%s", A B)
然后在代码中
EXAMPLE("foo ", "bar\n");
printf("%s", "foo bar\n");
(由于您没有显示完整的代码,我认为您可以根据您的情况进行调整)
3 回答
我建议使用:
缺点是您必须至少有一个非格式字符串参数,即您不能将宏用作:
了 .
对于某些编译器,有一些解决办法允许空
__VA_ARGS__
之类的在gcc(感谢M. Oehm) .
如果您希望
\n
始终在决赛中,您可以再添加一个printf
语句:输出:
正如其他人所指出的那样,在这种情况下,这将无法正常工作:
所以你必须这样定义宏:
感谢M. Oehm和undur_gongor
如果您知道第一个参数始终是字符串文字,则可以使用字符串文字连接执行此操作 .
如果你有一个宏
然后在代码中
会是一样的
(由于您没有显示完整的代码,我认为您可以根据您的情况进行调整)