如何将printf()封装成函数或宏的包装器?

2026-04-16 22:541阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计380个文字,预计阅读时间需要2分钟。

如何将printf()封装成函数或宏的包装器?

这听起来像是一个面试问题,但实际是一个实际问题。我正在使用嵌入式平台,并仅提供以下功能:printf()、snprintf()、此外部printf()。实现(和签名)可能很快就会发生变化。

这听起来有点像面试问题,但实际上是一个实际问题.

我正在使用嵌入式平台,并且仅提供这​​些功能的等价物:

> printf()
> snprintf()

此外,printf()实现(和签名)很可能在不久的将来发生变化,因此对它的调用必须驻留在一个单独的模块中,以便以后易于迁移.

鉴于这些,我可以在一些函数或宏中包装日志记录调用吗?目标是我的源代码调用THAT_MACRO(“兔子数:%d”,numBunnies);在一千个地方,但只能在一个地方看到对上述功能的调用.

编译器:arm-gcc -std = c99

既然您可以使用C99,我将其包装在 variadic macro中:

如何将printf()封装成函数或宏的包装器?

#define TM_PRINTF(f_, ...) printf((f_), __VA_ARGS__) #define TM_SNPRINTF(s_, sz_, f_, ...) snprintf((s_), (sz_), (f_), __VA_ARGS__)

因为你没有说你有vprintf或类似的东西.如果你确实有这样的东西,你可以将它包装在谢尔盖L在他的答案中提供的功能中.

编辑:

上述TM_PRINTF不适用于空的VA_ARGS列表.
至少在GCC中可以写:

#define TM_PRINTF(f_, ...) printf((f_), ##__VA_ARGS__)

如果__VA_ARGS__为空,则两个##符号删除它们前面的多余逗号.

本文共计380个文字,预计阅读时间需要2分钟。

如何将printf()封装成函数或宏的包装器?

这听起来像是一个面试问题,但实际是一个实际问题。我正在使用嵌入式平台,并仅提供以下功能:printf()、snprintf()、此外部printf()。实现(和签名)可能很快就会发生变化。

这听起来有点像面试问题,但实际上是一个实际问题.

我正在使用嵌入式平台,并且仅提供这​​些功能的等价物:

> printf()
> snprintf()

此外,printf()实现(和签名)很可能在不久的将来发生变化,因此对它的调用必须驻留在一个单独的模块中,以便以后易于迁移.

鉴于这些,我可以在一些函数或宏中包装日志记录调用吗?目标是我的源代码调用THAT_MACRO(“兔子数:%d”,numBunnies);在一千个地方,但只能在一个地方看到对上述功能的调用.

编译器:arm-gcc -std = c99

既然您可以使用C99,我将其包装在 variadic macro中:

如何将printf()封装成函数或宏的包装器?

#define TM_PRINTF(f_, ...) printf((f_), __VA_ARGS__) #define TM_SNPRINTF(s_, sz_, f_, ...) snprintf((s_), (sz_), (f_), __VA_ARGS__)

因为你没有说你有vprintf或类似的东西.如果你确实有这样的东西,你可以将它包装在谢尔盖L在他的答案中提供的功能中.

编辑:

上述TM_PRINTF不适用于空的VA_ARGS列表.
至少在GCC中可以写:

#define TM_PRINTF(f_, ...) printf((f_), ##__VA_ARGS__)

如果__VA_ARGS__为空,则两个##符号删除它们前面的多余逗号.