如何在宏中使用printf的variadic参数?
我发现无法将第一个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”). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – rails 2.3.0 – 未定义的方法`activate_b
- 设计模式之规格模式
- c# – 如何使用查询语法创建排列?
- flex与webService公用DES能够进行统一的加密解密
- OpenRTMFP/Cumulus Primer 入门(3)图解CumulusEdge原理
- drupal的比喻
- ruby-on-rails – Rails redirect_to与params
- ruby-on-rails – has_one和has_many在同一模型.轨道如何跟
- ruby-on-rails – rails 3.1 scss以及指南针适合哪里?
- c# – 如何确保字符串是否干净以插入javascript警报(‘错误