繁体   English   中英

严格的C90代码的GCC选项?

[英]GCC options for strict C90 code?

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

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

有谁知道:

  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?

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

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

您所寻求的是不仅在您使用不在C90中的C99 / C11 / GNU 语言功能时,而且在您使用未由C90本身定义的函数时警告您的内容。 遗憾的是,由于上面提到的原因,编译器本身无法做到这一点 - 它与使用它的libc是相反的。 glibc系统上,C标准库将接受-std=c90-ansi定义的宏:

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

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

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

但是,这仅涵盖扩展和POSIX-but-not-ISO C功能; 如果在ISO C和POSIX.1中以不同方式指定函数的行为,它将不会保存您!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM