gcc';s-Wc90-c99-compat标志有效吗?
我有一个类似的代码gcc';s-Wc90-c99-compat标志有效吗?,c,gcc,c99,c89,C,Gcc,C99,C89,我有一个类似的代码 #include <stdio.h> #include <stdbool.h> main() { bool ok = true; printf("%u\n", ok); } 但我没有收到任何警告 从那以后我就期待着某种警告。说明-Wc90-c99-compat标志用于 [w] 了解ISO C90中未包含但ISO C99中包含的功能 给你。我的gcc版本是7.3.0,TIO的版本是8.1.1 我是做错了什么还是误解了什么 更新。差不多
#include <stdio.h>
#include <stdbool.h>
main() {
bool ok = true;
printf("%u\n", ok);
}
但我没有收到任何警告
从那以后我就期待着某种警告。说明-Wc90-c99-compat
标志用于
[w] 了解ISO C90中未包含但ISO C99中包含的功能
给你。我的gcc版本是7.3.0,TIO的版本是8.1.1
我是做错了什么还是误解了什么
更新。差不多
#include <stdio.h>
main() {
_Bool ok = 1;
printf("%u\n", ok);
}
相关部分成为
main() {
_Bool ok = 1;
printf("%u\n", ok);
}
但在这方面没有出现任何错误
更新
正如其他人建议的那样,我已经提交了一份。[这更像是一个评论,而不是一个提问;AFAICT这看起来像是一个gcc错误,但有人可能会对此给出令人信服的解释] 您的示例可以简化为:
# 2 "a.c" 3
main() {
_Bool ok = 1;
}
由于缺陷(功能?)是cc-std=c90-Wc90-c99-compat-Wsystem headers
不会对c99\u Bool
类型发出警告,尽管有-Wsystem headers
选项
预处理器行指令末尾的3
表示它后面的代码来自系统头(参见c预处理器)——删除3
会返回有关\u Bool
的警告
如果检查cc-E
输出,您将看到bool
和true
宏的扩展被包装在这样的行中,因为它们是在系统头(stdbool.h
)中定义的:
$cat空调
#包括
main(){
bool ok=true;
}
$gcc-E a.c
...
main(){
#3“a.c”3 4
_布尔
#3“交流”
嗯=
#3“a.c”3 4
1.
#3“交流”
;
}
我本以为main()
会有警告。如果您删除#include
并将bool
更改为\u bool
,是否会发生任何变化?main()
是这样使用的,在C90中没有int
返回类型,或者至少在ANSI K&R中没有返回类型。这就是我为什么这样保留它的原因。是的,\u Bool
实际上发出了警告。考虑到stdbool.h
刚刚定义的宏\define true 1
和\define Bool\u Bool
,我认为它不会直接警告\u Bool
。我猜这个标志只警告语言特性,而不是标题,而
会因为是系统头而抑制警告。是的,这可能是因为宏是在系统头中定义的。Gcc知道宏来自何处,因此它可以抑制有关源自系统头的不可移植结构的警告。[R]删除该标志会返回有关\u Bool
的警告,抱歉,我无法理解。你这是什么意思?-Wsystem headers
标志对我来说没有任何区别。这意味着带有
include的代码永远不会产生警告,但如果我编译\u Bool
版本,它总是会产生警告。从“#”行指令/标记中删除“3”标志会返回警告。很抱歉,如果从上下文看不清楚,谢谢你的澄清,我已经证实了这一点。我将通过gcc
HQ以某种方式提交一个关于它的bug,如果我学到了什么,我会回来。-Wsystem headers不应该更改预处理器输出,它应该指示编译器警告可疑的构造,即使是在系统头中,以及在系统头中定义的宏的扩展中。它没有发出警告的事实是错误(imo)。我将编辑掉“cc-E”调用中无用的标志(它们是命令行编辑的产物),因为它们似乎是造成混乱的原因。@KohányiRóbert:当你提交错误报告时,你能在这里为后代添加链接吗?如果它是一个确认的错误,你可以用它回答你自己的问题。
main() {
_Bool ok = 1;
printf("%u\n", ok);
}
# 2 "a.c" 3
main() {
_Bool ok = 1;
}
$ cat a.c
#include <stdbool.h>
main() {
bool ok = true;
}
$ gcc -E a.c
...
main() {
# 3 "a.c" 3 4
_Bool
# 3 "a.c"
ok =
# 3 "a.c" 3 4
1
# 3 "a.c"
;
}