C 如何判断编译器是否支持C90 C99?

参考:《C Primer Plus》,Stephen Prata著,姜佑译。

ANSI/ISO C标准

美国ANSI成立委员会X3J11,于89/90年,99年,11年,发布C标准:C89/C90,C99,C11。

ANSI/ISO 各版本C标准
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语言标准众多,要如何判断编译器所支持的标准版本?

一个简单的方法是,依据不同版本标准所支持的数据类型关键字来判别,如下表所示:

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
", a);

    // C99
    _Bool b = 1;
     if (b)
     {
         printf("b is true.
");
     }
     else{
         printf("b is false
");
     }
     
    return 0;
}

 运行结果表明编译器支持C99:

原文地址:https://www.cnblogs.com/fortunely/p/9490979.html