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 版本是不是有点“迂腐”?
-pedantic
(与任何其他 gcc 选项一样)没有很好地记录/行为与文档声明不同。因此行为方式反复无常。文档声称:
如果用
指定的标准代表 C 的 GNU 扩展方言,例如“gnu90”或“gnu99”,则有一个相应的基本标准,即 GNU 扩展方言所基于的 ISO C 版本。在基本标准要求的地方,会给出来自-std
的警告。-Wpedantic
显然事实并非如此。在 ISO C17 中,
typeof(foo)
是某种宏或函数调用,需要提前定义,否则代码不应静默地通过编译。仅使用 -pedantic
即可对严格符合 C17 的代码进行错误诊断:
#include <stdio.h>
int main(void) {
int typeof = 0;
}
正如您所注意到的,指定
-std=c17
等会使编译器符合要求,因此关于遵循“基本标准”(ISO C17)的编译器的 gcc 文档显然是不正确/过时的。也许在 C89 左右的日子里曾经有过这种情况。
请注意,在许多情况下,即使在严格模式下,较新版本的 gcc 也很难进行诊断,因此使用这些编译器选项并不能保证您的代码符合 C 标准。