我正在尝试找出在测试严格 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
上述方法效果很好(没有出现警告/错误)。
有谁知道:
编辑:
对不起我的措辞,是的,我真的想模仿一个严格符合C90的编译器,换句话说,如果代码试图使用以后添加的任何功能(C99会浮现在脑海中),它应该会失败。所以pthread
包含标题应该在用GNU/GCC calls C90 mode编译时发出警告(就像stdint.h标题应该产生没有C99的警告)。 -pedantic很好地警告我long long
的用法,我不明白为什么它不应警告我uint64_t
。
我使用ISO / IEC 9899:1990的术语引用自:
1990年,采用了ANSI C标准(格式化更改) 国际标准化组织(ISO)作为ISO / IEC 9899:1990,有时被称为C90。因此,条款&#34; C89&#34; 和&#34; C90&#34;指的是相同的编程语言。
EDIT2:
GCC文档实际上非常清楚:
作为C99标准的一部分的一些功能被接受为 C90模式下的扩展,以及属于C11的一些功能 标准被接受为C90和C99模式的扩展。
所以我的问题被改写为:
答案 0 :(得分:12)
C90合规性并不意味着编译器无法提供C90标准中未提及的其他标头。 (例如,sys/socket.h
。)如果您因某些奇怪的原因而不允许这些,可以通过-I
选项添加额外的包含路径,并在该路径中放置所有C99的版本 - 只有标题#error Don't include me
。
答案 1 :(得分:1)
请记住,GCC本身是指定的C标准的符合独立的实现;这样的实现只提供标准头文件的一小部分,几乎没有C标准库的实际功能,而是依赖于另一方 - 例如Linux系统上的glibc
来提供C标准库的功能。
当您使用C90中不存在的C99 / C11 / GNU 语言功能但使用库 C90本身未定义的功能。可悲的是,由于上面提到的原因,编译器本身无法做到这一点 - 它与使用libc
的内容完全相同。在glibc
系统上,C标准库将选择由-std=c90
或-ansi
定义的宏:
使用
__STRICT_ANSI__
选项时预定义宏-ansi
。某些头文件可能会注意到这个宏,并且不会声明某些函数或定义ISO标准不会要求的某些宏;这是为了避免干扰任何可能将这些名称用于其他事物的程序。
并通过关闭免费扩展程序为您提供帮助:
如果使用
‘gcc -ansi’
编译程序,则只能获得ISO C库功能,除非您通过定义一个或多个功能宏明确请求其他功能。
但是,这仅涵盖扩展和POSIX-but-not-ISO C功能;如果在ISO C和POSIX.1中以不同方式指定函数的行为,它将无法保存您!