宏关闭printf语句
什么MACRO可以用来关闭printf语句,而不是全部删除它们用于部署版本,我只想关闭它们,跳过它们,忽略它们。
编辑:我个人使用gcc,但代码是一个更大的项目的一部分,将在运行Ubuntu的pandas板上编译。
不完全是你要求的,但是当我没有合适的日志记录系统时,我在我的代码中使用这个构造进行调试输出:
#if 1 #define SPAM(a) printf a #else #define SPAM(a) (void)0 #endif
所以我可以在我的代码中做到这一点
SPAM(("foo: %d\n", 42));
然后通过在#if
中将1
更改为0
来禁用所有这些。
但是如果你在编写代码的所有编译器中都有可变宏支持,那么你可以寻找其他答案并重新定义printf
。 (话虽如此,我发现在代码中从常规调试打印不同是有用的 – 使用不同的函数名称有助于提高可读性。)
请注意,您还可以将stdout
重定向到/dev/null
,但我认为您还希望摆脱运行时开销。
#ifdef IGNORE_PRINTF #define printf(fmt, ...) (0) #endif
另请参阅C #define宏以进行调试打印 ,其中讨论了与此密切相关的一些重要问题。
两个选项,或者:
#define printf(...)
(需要C99可变参数宏参数),你需要将它放在一些常见的头文件中,这个文件在stdio.h之前永远不会被包含,如果有的话。
或者你可以告诉链接器将它链接到其他东西,在你要定义的GCC中
int wrap_printf(void) {return 0;}
和链接使用
--wrap printf
总而言之,你可能不应该使用printf
打印调试输出,而是使用宏或实用function(如果你愿意,可以使用printf),你可以更好地控制它。
希望有所帮助。
我使用PDEB作为调试printf()s(不是全部)的前缀。
对于调试版本,我使用-DPDEB编译=(无)
对于发布版本,我使用-DPDEB =“0 &&”或-DPDEB =“0 &&”进行编译
那样,下面的代码(test.c):
#include void main(void) { printf("normal print\n"); PDEB printf("debug print\n"); }
输出:(在释放模式下):正常打印
(在调试模式下):正常打印调试打印
理想情况下,人们可以将PDEB转换为“//”(注释标记),除了在标准预处理/处理链下这是不可能的。
如果你想避免Jonathan的回答可能给你的潜在警告,如果你不介意打印一个空的printf
你也可以做类似的事情
#define printf(...) printf("")
这是有效的,因为C宏不是递归的。 扩展的printf("")
将保留原样。
另一种变体(因为你使用的是gcc)就像是
inline int ignore_printf(char const*, ...) __attribute__ ((format (printf, 1, 2))); inline int ignore_printf(char const*, ...) { return 0; } #define printf ignore_printf
并在一个编译单元
int ignore_printf(char const*, ...)
另一种可能性是freopen("/dev/null", "w", stdout);
这并不完全禁用printf
– 它大致相当于使用stdout重定向到/ dev / null来运行你的程序,例如: ./myprog > /dev/null
在shell提示符下。
我为此使用了两个宏。 第一个定义了打印条件。 在这个简单的例子中,我们在参数不为零的任何时候打印。 可以使用更复杂的表达式。
第二个基于第一个宏确定是否调用printf。
如果条件可以由编译器确定(使用正确的优化设置),则不生成代码。
如果在编译时无法确定条件,那么将在运行时。 这种方法的一个优点是,如果printf不会发生,那么整个printf就不会被评估,从而避免在复杂的printf语句中发生很多字符串转换。
#define need_to_print(flag)((flag)!= 0)) #define my_printf(debug_level,...)\ ({\ if(need_to_print(debug_level))\ 的printf(__ VA_ARGS__); \ })
使用它调用my_printf而不是printf,并在打印条件的开头添加一个参数。
my_printf(0,“value =%d \ n”,vv); //这不会打印 my_printf(1,“value =%d \ n”,vv); //这会打印出来 my_printf(print_debug,“value =%d \ n”,vv); //如果print_debug!= 0,将打印
围绕宏的(…)括号使它成为单个语句。
我在公共头文件中包含#define printf
//。 它将压制所有printf
。
下面简单的function服务的目的,我使用相同。
int printf(const char *fmt, ...) { return (0) }