宏关闭printf语句

jar*_*ryd 21 c

什么MACRO可以用来关闭printf语句,而不是全部删除它们用于部署版本,我只想关闭它们,跳过它们,忽略它们.

编辑:我个人使用gcc,但代码是一个更大的项目的一部分,将在运行Ubuntu的熊猫板上编译.

Ale*_*ysh 22

不完全是你要求的,但是当我没有合适的日志记录系统时,我在我的代码中使用这个构造进行调试输出:

#if 1
  #define SPAM(a) printf a
#else
  #define SPAM(a) (void)0
#endif
Run Code Online (Sandbox Code Playgroud)

所以我可以在我的代码中做到这一点

SPAM(("foo: %d\n", 42));
Run Code Online (Sandbox Code Playgroud)

然后通过改变禁用所有的人都10#if上面.

但是如果你在编写代码的所有编译器中都有可变宏支持,那么你可以寻求其他答案并重新定义printf.(话虽如此,我发现在代码中从常规调试打印不同是有用的 - 使用不同的函数名称有助于提高可读性.)

请注意,您也可以重定向stdout/dev/null,但我认为您也想摆脱运行时开销.


Jon*_*ler 16

#ifdef IGNORE_PRINTF
#define printf(fmt, ...) (0)
#endif
Run Code Online (Sandbox Code Playgroud)

另请参阅C#define宏以进行调试打印,其中讨论了与此密切相关的一些重要问题.

  • @Alexander:但C99是目前的C标准; 如果他想使用旧标准,或者正在使用主要原生编译器过时的机器,他应该这样说. (6认同)
  • @Alexander:我说的是当前的(C99)标准 - 它确实如此. (3认同)

fal*_*tro 9

两种选择,或者:

#define printf(...)
Run Code Online (Sandbox Code Playgroud)

(需要C99可变参数宏参数),你需要把它放在一些常见的头文件中,这个文件在stdio.h之前永远不会被包含,如果有的话.

或者你可以告诉链接器将它链接到其他东西,在你要定义的GCC中

int wrap_printf(void) {return 0;}
Run Code Online (Sandbox Code Playgroud)

和链接使用

--wrap printf
Run Code Online (Sandbox Code Playgroud)

总而言之,您可能不应该使用printf打印调试输出,而是使用宏或实用程序功能(如果您愿意,可以使用printf),您可以更好地控制它.

希望有所帮助.