printf定义为void

时间:2012-03-18 05:11:57

标签: c printf void

我想出了一种方法,在阅读C-FAQs的同时,一次静音所有printf s。

你能告诉我这是怎么回事吗?计划:

#include<stdio.h>

//How to silence all printfs at once!!!

#define printf (void) 

#define ab a b c d e f
#define xstr(a) str(a)
#define str(a) #a

#define string "The politicians do not even know the" xstr(ab) "of politics"

main(){

char *all=str(a b c d e f);

printf("%s\n",all);
printf(string);

}

程序输出为空白。我的意思是它根本不打印任何东西。如果我#define printf为:

/ #define printf  

这也表现得一样。我不明白GCC是如何在两种情况下编译调用的。没有错误,绝对没有警告。

  • 第一个案例printf变为:(void)("%s\n",all);
  • 第二个案例printf变为:("%s\n",all);

3 个答案:

答案 0 :(得分:3)

C有comma operator,这意味着两个表达式都有效。

答案 1 :(得分:0)

预处理器将函数替换为空格或空格,这就是它在运行时不被调用的原因。

答案 2 :(得分:0)

当它发生时,它都会编译成一个括号表达式,它只是什么都不做,并返回它的最后一个元素的值(用逗号分隔 - 这是C的逗号运算符,你有时可以在循环条件中看到它)。即使你没有将它转换为void,大多数编译器的默认设置也不是要警告忽略的非void返回值,所以它编译得很好。