我想出了一种方法,在阅读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);
答案 0 :(得分:3)
C有comma operator,这意味着两个表达式都有效。
答案 1 :(得分:0)
预处理器将函数替换为空格或空格,这就是它在运行时不被调用的原因。
答案 2 :(得分:0)
当它发生时,它都会编译成一个括号表达式,它只是什么都不做,并返回它的最后一个元素的值(用逗号分隔 - 这是C的逗号运算符,你有时可以在循环条件中看到它)。即使你没有将它转换为void,大多数编译器的默认设置也不是要警告忽略的非void返回值,所以它编译得很好。