我正在尝试找到测试严格C90符合性时使用的gcc标志组合。根据之前的帖子:GCC options for strictest C code?,我只需要一个--std=c90。
然而,这是我尝试过的:
$ cat t.c
#include <stdint.h> /* added in C99 */
int main()
{
uint64_t t;
return 0;
}
$ gcc -std=c90 -ansi -pedantic t.c
上述方法有效(没有产生警告/错误)。
有人知道以下内容吗:
1. gcc标志以严格的ISO/IEC 9899:1990一致性 2. 具有不同标志集的其他编译器(tcc、clang等)?
编辑:
对我的措辞很抱歉,是的,我真的想模仿一个严格符合C90标准的编译器,换句话说,如果代码尝试使用后来添加的任何功能(如C99),则应该失败。因此,在GNU/GCC称为C90模式下编译pthread包含头文件应该发出警告(就像stdint.h头文件在没有C99的情况下应该发出警告一样)。-pedantic很好地警告我使用
long long
,我不明白为什么它不会警告我使用uint64_t
。我引用了ISO/IEC 9899:1990的术语。 1990年,ANSI C标准(经过格式更改)被国际标准化组织(ISO)采用为ISO/IEC 9899:1990,有时称为C90。因此,“C89”和“C90”这两个术语指的是同一种编程语言。
编辑2:
GCC文档实际上非常清楚:
在C90模式下,一些属于C99标准的特性被接受为扩展功能,在C90和C99模式下,一些属于C11标准的特性被接受为扩展功能。
所以我的问题可以重新表述为:
- 在Linux系统上是否有一个编译器+标准包含头文件严格遵守C90?
<stdint.h>
中没有任何东西应该无法编译。实现允许省略任何它不提供的相应类型的 typedefs/macros。如果您尝试在 C++03 中包含 C++11 标头,则编译器本身不会发出诊断,而是 GCC 在头文件中有一个#error
pragma。 - user3920237#if (__STDC_VERSION__ < 199901 && __PEDANTIC__)
的内容,然后在例如stdint.h
中加入一个#error
指令来轻松实现。然而,他们可能不会这样做,因为我认为绝大多数用户并不真正需要该功能,而且他们可能不会打补丁修复两打头文件“以防万一”。当然,你总是可以尝试提交一个补丁。 - Damon