严格C90代码的GCC选项?

我试图在测试严格的 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

上面的工作很好(没有警告/错误产生)。

有谁知道:

  • gcc标志符合严格的ISO / IEC 9899:1990标准
  • 一个不同的编译器(tcc,clang ...)具有不同的标志集合?
  • 编辑:

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

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

  • http://en.wikipedia.org/wiki/C_(programming_language)#ANSI_C_and_ISO_C
  • 1990年,国际标准化组织(ISO)采用ANSI C标准(格式变更)作为ISO / IEC 9899:1990,有时称为C90。 因此,术语“C89”和“C90”指的是相同的编程语言。

    EDIT2:

    GCC文件实际上非常清楚:

    作为C99标准一部分的某些功能在C90模式下被接受为扩展功能,并且属于C11标准的一些功能在C90和C99模式下被接受为扩展功能。

    所以我的问题被改写为:

  • 在一个严格符合C90的Linux系统中是否有一个编译器+标准include头文件?

  • 请记住,GCC本身是指定的C标准的符合性独立实现; 这样的实现只提供标准头文件的一小部分,实际上没有C标准库的实际功能,而是依赖于另一方(例如Linux系统上的glibc来提供C标准库的功能。

    当您使用的C99 / C11 / GNU语言功能不在C90中,但是当您使用C90本身未定义的库函数时,您所寻求的是不仅警告您。 可悲的是,仅仅因为上述原因,编译器无法做到这一点 - 它与它一起使用的libc是不合适的。 在glibc系统上,C标准库将采用-std=c90-ansi定义的宏:

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

    并通过关闭免费扩展程序给你一些帮助:

    如果使用'gcc -ansi'编译程序,除非通过定义一个或多个功能宏来显式请求附加功能,否则您只能获得ISO C库功能。

    但是,这仅涵盖扩展和POSIX-but-not-ISO C函数; 如果函数的行为在ISO C和POSIX.1中有不同的规定,它将不会保存你!


    C90合规性并不意味着编译器不能提供C90标准中未提及的其他头文件。 (例如, sys/socket.h )。如果你想由于一些奇怪的原因而不允许这些,你可以传递-I选项来添加一个额外的包含路径,并且在那个路径中放入所有只有C99的头文件只是#error Don't include me

    链接地址: http://www.djcxy.com/p/86365.html

    上一篇: GCC options for strict C90 code?

    下一篇: Forcing compiler to C99 standard