ANSI C、C89、C99和C51的区别

ANSI C、C89、C99和C51的区别

什么是ANSI C、ISO C、C89、C90标准?

随着C语言使用得越来越广泛,出现了许多新问题,人们日益强烈地要求对C语言进行标准化。1983年,美国国家标准协会(ANSI)组成了一个委员会,X3J11,为了创立 C 的一套标准。经过漫长而艰苦的过程,该标准于1989年完成,这个版本的语言经常被称作ANSI C,或有时称为C89(为了区别C99)。在1990年,ANSI C标准(带有一些小改动)被美国国家标准协会(ANSI)采纳为ISO/IEC 9899:1990。这个版本有时候称为C90或者ISO C综上,ANSI C、ISO C、C89、C90其实是同一种标准。

什么是C99标准?

2000年3月,ANSI 采纳了 ISO/IEC 9899:1999 标准。这个标准通常指C99。 C99新增了一些特性,如:支持不定长的数组,即数组长度可以在运行时决定。变量声明不必放在语句块的开头,for语句提倡写成for(int i=0;i<100;++i) 的形式,即i只在for语句块内部有效。

什么是C11标准?

C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准。与C99相比,C11有哪些变化呢?

1、 对齐处理:alignof(T)返回T的对齐方式,aligned_alloc()以指定字节和对齐方式分配内存,头文件<stdalign.h>定义了这些内容。

2、 _Noreturn:_Noreturn是个函数修饰符,位置在函数返回类型的前面,声明函数无返回值,有点类似于gcc的__attribute__((noreturn)),后者在声明语句尾部。

3、 _Generic:_Generic支持轻量级范型编程,可以把一组具有不同类型而却有相同功能的函数抽象为一个接口。

4、 _Static_assert():_Static_assert(),静态断言,在编译时刻进行,断言表达式必须是在编译时期可以计算的表达式,而普通的assert()在运行时刻断言。

5、安全版本的几个函数:gets_s()取代了gets(),原因是后者这个I/O函数的实际缓冲区大小不确定,以至于发生常见的缓冲区溢出攻击,类似的函数还有其它的。

6、 fopen()新模式:fopen()增加了新的创建、打开模式“x”,在文件锁中比较常用。

7、 匿名结构体、联合体。

8、 多线程:头文件<threads.h>定义了创建和管理线程的函数,新的存储类修饰符_Thread_local限定了变量不能在多线程之间共享。

9、 _Atomic类型修饰符和头文件<stdatomic.h>。

10、改进的Unicode支持和头文件<uchar.h>。

11、quick_exit():又一种终止程序的方式,当exit()失败时用以终止程序。

12、复数宏,浮点数宏。

13、time.h新增timespec结构体,时间单位为纳秒,原来的timeval结构体时间单位为毫秒。

for循环内定义变量的问题

1.在C89(ANSI C)标准下,循环变量不能在for循环内定义,必须把标准改为C99标准才可正常编译

#include <stdio.h>

int main(void)
{
 	// C99允许在for循环内定义循环变量,而C89不允许
     for (int i = 0; i < 5; i++)    
     {
       printf("hello world!\n");
     }
   return 0;
}

C89标准下编译不通过

在这里插入图片描述

2.改为C99标准进行编译,就可以编译成功

在这里插入图片描述

什么是C51?

1.C51程序开发概述

单片机的C语言采用C51编译器(简称C51)。由C51产生的目标代码短、运行速度快、所需存储空间小、符合C语言的ANSI标准,生成的代码遵循Intel目标文件格式,而且可与A51汇编语言或PL/M51语言目标代码混合使用。在众多的C51编译器中,Keil公司的C语言编译/连接器KeilμVision软件最受欢迎。

2.采用C51的优点

采用C51 进行单片机应用系统的程序设计,编译器能自动完成变量的存储单元的分配,编程者可以专注于应用软件的设计,可以对常用的接口芯片编制通用的驱动函数,对常用的功能模块和算法编制相应的函数,可以方便地进行信号处理算法和程序的移植,从而加快单片机应用系统的开发过程。

所以用Keil软件编写的单片机程序是遵循ANSI C标准的,不能在for循环内定义循环变量

当然,在keil软件中更改C标准即可在for循环内定义变量,在C/C++选项中勾选C99 Mode

GCC选择C标准:

GCC编译器在编译的时候可指定C语言标准:

指定c90标准: -std=c90

指定C99标准: -std=c99

定C11标准(目前正在开发中): -std=c11

总结:

1.ANSI C或 C89是不允许在for循环内定义变量的

2.C99允许在for循环内定义变量

3.keil软件默认使用ANSI C标准,不能在for循环内定义循环变量

参考:https://mp.weixin.qq.com/s/R4oAz4zjleM1vliiMpyiog

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值