我没有办法将第一个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。以上宏取自这个堆栈溢出问题。
我正在做XC中的代码,运行在XMOS多逻辑核处理器上.它编译XC、C和C++,但代码示例来自C代码部分。它与XC类似,只不过它有一个在语言中定义的计时器。
如果不可能将两者合并为一个printf,那么可以选择创建一个字符串并使用sprintf吗?我宁愿不这样做,因为这样的数组很容易溢出。
发布于 2017-08-29 17:13:30
您需要使用字符串连接和标记粘贴。注意,在下面的片段中,在第一个字符串文字之后没有逗号--这是有意的。
#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")。
https://stackoverflow.com/questions/45944705
复制相似问题