C 如何判断编译器是否支持C90 C99?
参考:《C Primer Plus》,Stephen Prata著,姜佑译。
ANSI/ISO C标准
美国ANSI成立委员会X3J11,于89/90年,99年,11年,发布C标准:C89/C90,C99,C11。
C标准 | 描述 |
经典C | 也称K&R C,87年K&R著作《C语言程序设计》,成为C指导标准 |
C89/C90 |
89年ANSI C,90年ISO C,定义了C语言和C标准库。X3J11开发,同一套标准,发布名称/机构不同。 用意:作为实现,应该针对目标计算机定义适合特定操作,而不是强加一个抽象、统一的定义。 特点: 1.信任程序员; 2.不妨碍程序员做任何事; 3.语言简单精炼; 4.只提供一种方法执行一项操作; 5.不为程序可移植性牺牲效率。 |
C99 |
C9X委员会修订,遵循C90原则。 新特性: 1.支持国际化编程; 2.调整现有实践致力于解决明显的缺陷; 3.为适应科学和工程项目中关键数值计算,提高C适应性; |
C11 |
特点: 1.不强调信任程序员; 2.不要求服务小型机市场供应商支持目标环境用不到的特性; |
C语言标准众多,要如何判断编译器所支持的标准版本?
一个简单的方法是,依据不同版本标准所支持的数据类型关键字来判别,如下表所示:
K&R给出的关键字(87 经典C) | C90添加关键字 | C99添加关键字 |
int | signed | _Bool |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
那么,可以在C程序中,定义相应类型,然后build是否支持来判断。
下面在Ubuntu OS下以为例,进行测试。
GCC版本=4.8.4
测试代码:
//C99.c #include <stdio.h> #include <stdint.h> int main(void) { // C90 signed int a = -10; printf("a=%d\n", a); // C99 _Bool b = 1; if (b) { printf("b is true.\n"); } else{ printf("b is false\n"); } return 0; }
运行结果表明编译器支持C99: