宏关闭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) }