严格的C90代码的GCC选项?

mal*_*lat 13 c gcc iso c89

我试图找到在测试严格的 C90一致性时使用的gcc标志的组合.根据以前的帖子:最严格的C代码的GCC选项?,我应该只需要--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
Run Code Online (Sandbox Code Playgroud)

以上确实运作良好(没有产生警告/错误).

有谁知道:

  1. gcc标志具有严格的ISO/IEC 9899:1990一致性
  2. 一个不同的编译器(tcc,clang ...)有不同的标志集?

编辑:

对不起,我的措辞,是的,我真的想模仿一个严格符合C90的编译器,换句话说,如果代码试图使用以后添加的任何功能(C99会浮现在脑海中),它应该会失败.所以pthread包含头应当GNU/GCC调用C90模式时编译时发出警告(就像stdint.h头应该产生没有C99的警告).-pedantic很好地警告我使用long long,我不明白为什么它不应该警告我uint64_t.

我使用ISO/IEC 9899:1990的术语引用自:

1990年,ANSI C标准(格式化改变)被国际标准化组织(ISO)采用为ISO/IEC 9899:1990,有时称为C90.因此,术语"C89"和"C90"指的是相同的编程语言.

EDIT2:

GCC文档实际上非常清楚:

作为C99标准的一部分的一些功能在C90模式中被接受为扩展,并且作为C11标准的一部分的一些功能在C90和C99模式中被接受为扩展.

所以我的问题被重新定义为:

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

Sne*_*tel 12

C90合规性并不意味着编译器不能提供C90标准中未提及的其他标头.(sys/socket.h例如.)如果你想因某些奇怪的原因而不允许这些,你可以通过-I选项添加一个额外的包含路径,并在该路径中放置所有仅C99标题的版本#error Don't include me.

  • "出于一些奇怪的原因" - 原因并不奇怪.如果OP想要测试他们的代码以确保它没有任何C99或OS特定的依赖关系,那么他们肯定**确实**想要限制自己使用这些头. (2认同)

LTh*_*ode 2

请记住,GCC 本身是指定的 C 标准的独立实现这样的实现仅提供标准头文件的一小部分,并且几乎不提供 C 标准库的实际功能,而是依赖另一方(glibc例如在 Linux 系统上)来提供 C 标准库的功能。

\n\n

您所寻求的是,不仅在您使用C90 中没有的C99/C11/GNU语言功能时发出警告,而且在您使用C90 本身未定义的库函数时发出警告。遗憾的是,由于上述原因,编译器本身无法做到这一点——它与libc它的用途无关。在glibc系统上,C 标准库将采用-std=c90或定义的宏-ansi

\n\n
\n

使用该选项时,宏__STRICT_ANSI__是预定义的。-ansi某些头文件可能会注意到此宏,并避免声明 ISO 标准不要求的某些函数或定义某些宏;这是为了避免干扰任何可能将这些名称用于其他用途的程序。

\n
\n\n

并通过关闭免费扩展为您提供一些帮助:

\n\n
\n

如果使用 编译程序\xe2\x80\x98gcc -ansi\xe2\x80\x99,则只能获得 ISO C 库功能,除非您通过定义一个或多个功能宏来明确请求其他功能。

\n
\n\n

然而,这仅涵盖扩展和 POSIX-but-not-ISO C 函数;如果 ISO C 和 POSIX.1 中对函数的行为指定不同,它也救不了你!

\n