gpt4 book ai didi

c - 如何在宏中将可变参数与 printf 一起使用?

转载 作者:太空狗 更新时间:2023-10-29 15:40:00 25 4
gpt4 key购买 nike

我没有找到将第一个 printf 合并到第二个的方法:

unsigned get_time_now(void) {return 1;}
#define DEBUG_PRINT 1
#define debug_tcprintf(fmt, ...) do { \
if (DEBUG_PRINT) { \
unsigned p_time_now = get_time_now(); \
printf ("%u ms ", p_time_now); \
printf(fmt, __VA_ARGS__); \
} \
} while (0)

我需要完成此操作才能获得原子 debug_tcprintf。上面的宏取自 this Stack Overflow question .

我正在 XC 中编写代码,该代码在 XMOS 多逻辑核心处理器上运行。它编译 XC、C 和 C++,但代码示例来自 C 代码部分。它与 XC 类似,只是它有一个用语言定义的计时器。

如果无法将两者合并为一个 printf,一个选项可能是创建一个字符串并改用 sprintf?我宁愿不这样做,因为这样的数组很容易溢出。

最佳答案

您需要使用字符串连接和 token pasting .请注意,在下面的代码片段中,第一个字符串文字后没有逗号——这是故意的。

#define debug_tcprintf(fmt, ...) do { \
if (DEBUG_PRINT_HTTPD) { \
unsigned p_time_now = get_time_now (); \
printf ("%u ms " fmt, p_time_now, ##__VA_ARGS__); \
} \
} while (0)

字符串连接允许您将 "%u ms " 部分添加到提供的格式字符串中。标记粘贴(## 运算符)考虑了使用或不使用其他可变参数(不仅仅是格式字符串)调用宏的可能性。

这仅在您使用字符串文字作为格式字符串调用宏时有效。


附录:本例中使用的标记粘贴方式实际上是标准 C 预处理器的 gcc 扩展。如果您不使用 gcc 编译器,则可能需要省略 ## 运算符。这样做的缺点是你不能只用一个参数调用你的宏;例如,debug_tcprintf ("hello world") 将不起作用。一个简单的解决方法是在这种情况下使用 debug_tcprintf ("%s", "hello world")

关于c - 如何在宏中将可变参数与 printf 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45944705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com