我有类似的代码
#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。
答案 0 :(得分:0)
[更多的是评论,而不是要求; AFAICT这看起来像是gcc错误,但可能有人对此给出了有力的解释]
您的示例可以简化为:
# 2 "a.c" 3
main() {
_Bool ok = 1;
}
尽管有cc -std=c90 -Wc90-c99-compat -Wsystem-headers
选项,但错误(功能)是_Bool
不会警告c99 -Wsystem-headers
类型。
预处理器行指令末尾的3
意味着它后面的代码来自系统头文件(请参见c预处理器docs)-删除3
返回有关_Bool
的警告。
如果您检查cc -E
的输出,您将看到bool
和true
宏的扩展包含在这样的行中,因为它们是在系统头文件中定义的({{ 1}}):
stdbool.h