严格的C90代码的GCC选项?

时间:2014-10-22 07:28:23

标签: c gcc iso c89

我正在尝试找出在测试严格 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 ...)?
  3. 编辑:

    对不起我的措辞,是的,我真的想模仿一个严格符合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模式的扩展。

    所以我的问题被改写为:

    • linux系统上是否有编译器+标准include头,严格符合C90?

2 个答案:

答案 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中以不同方式指定函数的行为,它将无法保存您!