首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在宏中使用带有printf的变量参数?

如何在宏中使用带有printf的变量参数?
EN

Stack Overflow用户
提问于 2017-08-29 17:08:09
回答 1查看 2.6K关注 0票数 7

我没有办法将第一个printf合并为第二个:

代码语言:javascript
复制
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吗?我宁愿不这样做,因为这样的数组很容易溢出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 17:13:30

您需要使用字符串连接和标记粘贴。注意,在下面的片段中,在第一个字符串文字之后没有逗号--这是有意的。

代码语言:javascript
复制
#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")

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45944705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档