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),全部)


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

C有a,这意味着这两个表达式都是有效的。

预处理器将函数替换为空格或void,这就是为什么在运行时不调用它。

预处理器将函数替换为空格或void,这就是为什么在运行时不调用它。

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

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

谢谢,我从未强调过逗号运算符。这是一个很好的示例。再次感谢。请注意,实际上检查
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