【问题标题】:How does gcc's -Wc90-c99-compat flag works?gcc 的 -Wc90-c99-compat 标志是如何工作的?
【发布时间】: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 &lt;stdbool.h&gt; 并将bool 更改为_Bool,有什么变化吗?
  • main() 是这样使用的,在 C90 或至少在 ANSI K&R 中没有 int 返回类型。这就是为什么我就这样离开了。是的,_Bool 实际上发出了警告。
  • 考虑到stdbool.h刚刚定义了宏#define true 1#define bool _Bool,我认为它不会直接警告_Bool
  • 我的猜测是该标志只警告语言功能,而不是标题,并且 &lt;stdbool.h&gt; 由于是系统标题而抑制警告。
  • 是的,这可能是因为宏是在系统头文件中定义的。 Gcc 知道宏的来源,因此它可以抑制有关源自系统头文件的不可移植构造的警告。

标签: c gcc c99 c89


【解决方案1】:

[这更像是一个评论而不是一个回答; AFAICT,这看起来像一个 gcc 错误,但有人可能会给出一个有说服力的解释]

你的例子可以简化为:

# 2 "a.c" 3
main() {
    _Bool ok = 1;
}

错误(功能?)是 cc -std=c90 -Wc90-c99-compat -Wsystem-headers 不会警告 c99 _Bool 类型,尽管有 -Wsystem-headers 选项。

预处理器行指令末尾的3 意味着它后面的代码来自系统头文件(请参阅c 预处理器docs)——删除3 会返回有关@987654328 的警告@。

如果您检查cc -E 输出,您会看到booltrue 宏的扩展被包裹在这样的行中,因为它们是在系统标头(stdbool.h)中定义的:

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

【讨论】:

  • [R]移除该标志会带回关于_Bool的警告 抱歉,我无法理解。你是什​​么意思? -Wsystem-headers 标志对我来说根本没有任何区别。这意味着包含 &lt;stdbool.h&gt; 的代码永远不会产生警告,但如果我编译 _Bool 版本,它总是会产生。
  • 从 '#' 行指令/标记中删除 '3' 标志会返回警告。对不起,如果从上下文中不清楚
  • 明白了,感谢您的澄清,我已经确认是这种情况。我会以某种方式通过gcc HQ 提交一个关于它的错误,如果我学到任何东西就会回来。
  • -Wsystem-headers 不应该改变预处理器的输出,它应该指导编译器警告可疑的结构,即使在系统头文件中,以及在系统头文件中定义的宏的扩展中。它没有警告的事实是错误(imo)。我将从“cc -E”调用中删除无用的标志(它们是命令行编辑的产物),因为它们似乎是造成混乱的原因。
  • @KohányiRóbert :当您提交该错误报告时,您可以在此处添加指向它的链接以供后代使用吗?如果这是一个已确认的错误,您可以用它来回答您自己的问题。
猜你喜欢
  • 2011-11-09
  • 2011-01-12
  • 2015-07-10
  • 2015-11-21
  • 2016-04-14
  • 2019-10-26
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多