C printf定义为void
我想出了一种方法,在阅读时立即使所有的C printf定义为void,c,printf,void,C,Printf,Void,我想出了一种方法,在阅读时立即使所有的printfs静音 你能告诉我这是怎么回事吗。节目: #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
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);
}
这也有同样的表现。我不理解GCC是如何编译这两种情况下的调用的。绝对没有错误和警告
- 第一种情况下,
变为:printf
(无效)(%s\n”,全部)代码>
- 第二种情况下,
变成:printf
(%s\n),全部)代码>
printf()返回值的代码
在任何一种情况下都会表现出奇怪的行为。事实上,第一个表达式很有可能根本无法编译——编译器将无法将void
表达式转换为任何可测试的表达式。它编译得很好。这两种情况都可以。只是因为没有使用返回值。谢谢,我从来没有强调过逗号运算符。这是一个v非常好的示例。再次感谢。请注意,实际检查printf()返回值的代码
在任何一种情况下都会表现出奇怪的行为。事实上,第一个表达式很有可能根本无法编译——编译器将无法将void
表达式转换为任何可测试的表达式。它编译得很好。这两种情况都可以。只是因为没有使用返回值。他知道这一点。他在问题的最后一句中写道“第一个案例变成XYZ”ezc。他知道这一点。他在“第一个案例变成XYZ”ezc问题的最后一句话中写道。第二个printf
变成(无效)(“政客们甚至不知道政治的“a b c d e f”);
是的,不知怎么错过了。抱歉。只是用-e选项编译了一下,看到了:)第二个printf
变成(无效)(“政客们甚至不知道政治的“a b c d e f”)是的,不知怎么漏掉了。抱歉。我只是用-E选项编译了一下,看到了:)我一直认为casting运算符不是左值。它基本上不能放在表达式的左边。你怎么解释?什么?我甚至不明白你的问题……关于*(int*)呢ptr=3;而amyway,你正在铸造的值没有被分配到,它们就在那里。哦,对不起,我是按照(int*)ptr=3的思路思考的,现在我明白了。你能告诉我我的理解是否正确吗,*(int*)prt=3有效,(int*)ptr=3无效,因为在第一种情况下,(int*)返回的值ptr被输入到尊重运算符,使其成为左值。我一直认为强制转换运算符不是左值。它基本上不能放在表达式的左侧。你如何解释这个问题?什么?我甚至不理解你的问题…关于*(int*)呢ptr=3;而amyway,你正在铸造的值没有被分配到,它们就在那里。哦,对不起,我是按照(int*)ptr=3的思路思考的,现在我明白了。你能告诉我我的理解是否正确吗,*(int*)prt=3有效,(int*)ptr=3无效,因为在第一种情况下,(int*)返回的值ptr被输入到尊重操作符,使其成为左值。
/ #define printf