我试图找到在测试严格的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
上面的方法确实很有效(没有产生警告/错误)。
有人知道:
GCC标志具有严格的ISO/IEC 9899:1990一致性
不同的编译器(tcc,clang…)有不同的标志集?
编辑:
抱歉,我的措辞,是的,我真的想模仿一个严格一致的c90编译器,换句话说,如果代码试图使用任何后来添加的功能,它应该会失败(想到c99)。所以当编译成whatGNU/GCC calls C90 mode时,include header应该发出一个警告(就像stdint.h header应该生成一个没有c99的警告一样)。-书呆子很好地警告我使用
pthread
,我不明白为什么它不应该警告我long long
。我使用了ISO/IEC 9899:1990的术语,引用自:
http://en.wikipedia.org/wiki/C_(programming_language)#ANSI_C_and_ISO_C
1990年,美国国家标准协会(ansi c)采用了c标准(格式有所改变)。
国际标准化组织
9899:1990,有时称为C90。因此,术语“c89”
“c90”指的是同一种编程语言。
编辑2:
gcc文档实际上非常清楚:
作为C99标准一部分的一些特性被接受为
c90模式下的扩展,以及c11中的一些特性
在C90和C99模式下,标准被接受为扩展。
所以我的问题被改写成:
Linux系统上是否有严格符合C90的编译器+标准包含头?
最佳答案
请记住,gcc本身是指定的c标准的一致的独立实现;这样的实现只提供标准头文件的一小部分,实际上没有c标准库的任何实际功能,而是依赖另一方(例如linux系统上的glibc
)来提供c标准库的功能。
您所寻求的不仅是在使用不在c90中的c99/c11/gnu语言功能时发出警告,而且在使用非c90本身定义的库函数时发出警告。遗憾的是,由于上述原因,编译器本身无法做到这一点——它与使用它的libc
无关。在glibc
系统上,c标准库将获取由-std=c90
或-ansi
定义的宏:
使用__STRICT_ANSI__
选项时,宏-ansi
是预定义的。一些头文件可能会注意到这个宏,并避免声明某些函数或定义某些ISO标准不需要的宏;这是为了避免干扰任何可能将这些名称用于其他目的的程序。
并通过关闭免费扩展来提供帮助:
如果使用‘gcc -ansi’
编译程序,则只能获得isoc库功能,除非通过定义一个或多个功能宏明确请求其他功能。
但是,这只包括扩展和posix,而不包括iso c函数;如果在isoc和posix.1中对函数的行为进行了不同的指定,它将不会保存您!
关于c - 严格的C90代码的GCC选项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26502307/