什么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)
然后通过改变禁用所有的人都1以0在#if上面.
但是如果你在编写代码的所有编译器中都有可变宏支持,那么你可以寻求其他答案并重新定义printf.(话虽如此,我发现在代码中从常规调试打印不同是有用的 - 使用不同的函数名称有助于提高可读性.)
请注意,您也可以重定向stdout到/dev/null,但我认为您也想摆脱运行时开销.
Jon*_*ler 16
#ifdef IGNORE_PRINTF
#define printf(fmt, ...) (0)
#endif
Run Code Online (Sandbox Code Playgroud)
另请参阅C#define宏以进行调试打印,其中讨论了与此密切相关的一些重要问题.
两种选择,或者:
#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),您可以更好地控制它.
希望有所帮助.