严格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
上面的工作很好(没有警告/错误产生)。
有谁知道:
编辑:
对不起我的措辞,是的,我真的很想模仿一个严格符合C90的编译器,换句话说,如果代码尝试使用后来添加的任何功能(C99浮现),它应该会失败。 所以pthread
包头应该在GNU / GCC调用C90模式下编译时发出警告(就像stdint.h头文件应该产生一个没有C99的警告)。 -pedantic很好地警告我使用long long
,我不明白为什么它不应该提醒我关于uint64_t
。
我使用了ISO / IEC 9899:1990的术语,引自:
1990年,国际标准化组织(ISO)采用ANSI C标准(格式变更)作为ISO / IEC 9899:1990,有时称为C90。 因此,术语“C89”和“C90”指的是相同的编程语言。
EDIT2:
GCC文件实际上非常清楚:
作为C99标准一部分的某些功能在C90模式下被接受为扩展功能,并且属于C11标准的一些功能在C90和C99模式下被接受为扩展功能。
所以我的问题被改写为:
请记住,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
。