gcc的-Wc90-c99-compat标志如何工作?

时间:2018-09-13 06:28:18

标签: c gcc c99 c89

我有类似的代码

#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

1 个答案:

答案 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的输出,您将看到booltrue宏的扩展包含在这样的行中,因为它们是在系统头文件中定义的({{ 1}}):

stdbool.h