为什么这个 gcc 学究会忽略扩展名?

问题描述 投票:0回答:1

gcc 警告选项文档 表示

-pedantic
选项应该对超出严格 ISO C 的禁止扩展发出警告。

但是,当我使用 gcc 9.4.0 版仅使用

-pedantic
编译以下代码时,它不会发出任何警告。

#include <stdio.h>
int main(void) {
    int foo;
    typeof(foo) bar = 42;
    printf("%d\n", bar);
}

我认为 gcc 会将

typeof()
捕获为错误,因为它是 gcc 扩展而不是 C17 标准的一部分。只有当同时设置
-pedantic
-std=c17
时,而不是默认的
-std=gnu17
,我才能找到所需的警告(“函数‘typeof’的隐式声明”)。

-pedantic
究竟是如何运作的?不指定 ISO C 版本是不是有点“迂腐”?

c gcc gcc-extensions gcc-pedantic
1个回答
0
投票

-pedantic
(与任何其他 gcc 选项一样)没有很好地记录/行为与文档声明不同。因此行为方式反复无常。文档声称:

如果用

-std
指定的标准代表 C 的 GNU 扩展方言,例如“gnu90”或“gnu99”,则有一个相应的基本标准,即 GNU 扩展方言所基于的 ISO C 版本。在基本标准要求的地方,会给出来自
-Wpedantic
的警告。

显然事实并非如此。在 ISO C17 中,

typeof(foo)
是某种宏或函数调用,需要提前定义,否则代码不应静默地通过编译。仅使用
-pedantic
即可对严格符合 C17 的代码进行错误诊断:

#include <stdio.h>
int main(void) {
    int typeof = 0;
}

正如您所注意到的,指定

-std=c17
等会使编译器符合要求,因此关于遵循“基本标准”(ISO C17)的编译器的 gcc 文档显然是不正确/过时的。也许在 C89 左右的日子里曾经有过这种情况。

请注意,在许多情况下,即使在严格模式下,较新版本的 gcc 也很难进行诊断,因此使用这些编译器选项并不能保证您的代码符合 C 标准。

© www.soinside.com 2019 - 2024. All rights reserved.