美文网首页C语言
C语言的几个标准

C语言的几个标准

作者: 学以解忧 | 来源:发表于2019-08-29 08:46 被阅读0次

我们在很多地方都有看到过K&R C、ANSI C、ISO C、C89、C99、C11等标准,具体有什么不同呢?(文末有个很好的实例)

什么是K&R C?

1978年,丹尼斯•里奇(Dennis Ritchie)布莱恩•柯林汉(Brian Kernighan)合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被称作K&R C

什么是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 标准。这个标准通常指C99C99新增了一些特性,如:支持不定长的数组,即数组长度可以在运行时决定。变量声明不必放在语句块的开头,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结构体时间单位为毫秒。

下面看一段程序:

#include <stdio.h>

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

   return 0;
}

C89标准下编译,结果为:

image

编译报错原因为,在C89标准下,循环变量不能在for循环内定义,必须把标准改为C99标准才可正常编译。以C99编译的命令为:

gcc -std=c99 test.c -o test.exe

如下图,以C99编译能成功编译:

image

所以在平时的开发中应该要了解编译器支持什么标准。因为,有时候编译出错是因为当前编译器支持的标准不同。

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

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

以上就是关于C语言标准的笔记,如有错误欢迎指出!


关注我的公号【嵌入式大杂烩】,回复:C语言,可获取C语言资料。
关注我的个人博客:【正念的博客】查看更多笔记

相关文章

  • C语言的几个标准

    我们在很多地方都有看到过K&R C、ANSI C、ISO C、C89、C99、C11等标准,具体有什么不同呢?(文...

  • web开发必备常识

    W3C标准 w3c标准是一系列标准的集合。包括以下几个部分: 结构标准语言(Structure): 可扩展标记语言...

  • 单片机学习笔记5-C51语言与标准C语言的比较

    C51语言基本语法与标准C相同,是在标准C的基础上进行适合8051内核单片机硬件的扩展。 C51语言与标准C语言一...

  • 2020-04-14 C标准

    C 语言自出现至今,出现了好几个标准,不同的标准对 C 的编程会稍有影响。 另外,C 的编译器有很多种,使用方法各...

  • C语言的原子操作

    C语言原子操作是在C11(C11:标准是C语言标准的第三版,前一个标准版本是[C99]标准)引入的,定义在头文件 ...

  • C语言002——简单解释

    C语言002——简单解释 C语言标准 为了让编写的C语言程序可以在多种平台上编译使用,必须要遵循一定的标准。在C语...

  • c语言标准

    四种标准 k&RC (1978) C89 (1989) C99 (1999) C11 (2011) k&RC 主要...

  • C语言的布尔值?

    在C语言标准(C89)没有定义布尔类型,所以C语言判断真假时以0为假,非0为真。 或者 C语言标准(C99)解决了...

  • C语言知识点

    第一部分:C语言知识点 1. C语言的官方标准 ANSI C / C89标准:1989年,美国国家标准协会(ANS...

  • C语言类型转换

    int/float to string/array: C语言提供了几个标准库函数,可以将任意类型(整型、长整型、浮...

网友评论

    本文标题:C语言的几个标准

    本文链接:https://www.haomeiwen.com/subject/vyjbectx.html