【发布时间】:2019-02-17 20:08:06
【问题描述】:
我有一个类似的代码
#include <stdio.h>
#include <stdbool.h>
main() {
bool ok = true;
printf("%u\n", ok);
}
我正在编译它
gcc -std=c90 -Wc90-c99-compat a.c
但我没有收到任何警告。
自bool is not defined in C90 以来,我预计会收到某种警告。 The gcc documentation 声明 -Wc90-c99-compat 标志用于
[w]了解 ISO C90 中不存在但 ISO C99 中存在的功能。
你可以在这里try it yourself。我gcc的版本是7.3.0,TIO的版本是8.1.1。
我做错了什么或误解了什么?
更新。类似的东西
#include <stdio.h>
main() {
_Bool ok = 1;
printf("%u\n", ok);
}
确实发出警告:警告:ISO C90 不支持布尔类型。 Try it here.
我也尝试过用
预处理第一个版本gcc -std=c90 -Wc90-c99-compat -E a.c
相关部分变为
main() {
_Bool ok = 1;
printf("%u\n", ok);
}
但没有提出任何错误。
更新。
正如其他人所说,我已经提交了bug report。
【问题讨论】:
-
我本来希望
main()收到警告。如果您删除#include <stdbool.h>并将bool更改为_Bool,有什么变化吗? -
main()是这样使用的,在 C90 或至少在 ANSI K&R 中没有int返回类型。这就是为什么我就这样离开了。是的,_Bool实际上发出了警告。 -
考虑到
stdbool.h刚刚定义了宏#define true 1和#define bool _Bool,我认为它不会直接警告_Bool。 -
我的猜测是该标志只警告语言功能,而不是标题,并且
<stdbool.h>由于是系统标题而抑制警告。 -
是的,这可能是因为宏是在系统头文件中定义的。 Gcc 知道宏的来源,因此它可以抑制有关源自系统头文件的不可移植构造的警告。