Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gcc';s-Wc90-c99-compat标志有效吗?_C_Gcc_C99_C89 - Fatal编程技术网

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"
                 ;
}