c99和c11之间的差异

时间:2016-07-15 21:27:02

标签: c c99 c11

我正在学习c,现在。 The book我读的是基于C99的。我想在完成本书后将我的知识更新到C11,或者如果存在重大差异则更改资源。因此,我要求的是更新我的知识的解释或资源。我只找到了this source。然而,它似乎并不包含我需要或不简洁的信息。

提前致谢。 P.S:我想学习C11,因为我认为它现在是普遍的标准。如果没有,请通知我。

2 个答案:

答案 0 :(得分:24)

C11标准的良好概述:

该标准包括对C99语言和库规范的若干更改,例如:

  • 对齐规范(_Alignas说明符,_Alignof运算符,aligned_alloc函数,<stdalign.h>头文件)
  • _Noreturn函数说明符和<stdnoreturn.h>头文件
  • 使用_Generic关键字的类型通用表达式。例如,以下宏cbrt(x)会转换为cbrtl(x)cbrt(x)cbrtf(x),具体取决于x的类型:

    #define cbrt(x) _Generic((x), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(x)
    
  • 多线程支持(_Thread_local存储类说明符,<threads.h>标头,包括线程创建/管理函数,互斥锁,条件变量和特定于线程的存储功能,以及{ {1}}类型限定符和_Atomic用于不间断对象访问。)

  • 基于C Unicode技术报告ISO / IEC TR 19769:2004(<stdatomic.h>char16_t类型改进了Unicode支持,用于存储char32_t编码数据,包括{{1}中的转换函数和相应的u和U字符串文字前缀,以及UTF-16/UTF-32编码文字的u8前缀。)
  • 删除<uchar.h>函数,在以前的C语言标准修订版ISO / IEC 9899:1999 / Cor.3:2007(E)中弃用,支持新的安全替代方案{{1} }。
  • 界限检查界面(附件K)。
  • 可分析性特征(附件L)。
  • 用于查询浮点类型特征的更多宏,涉及次正规浮点数和类型能够存储的小数位数。
  • 匿名结构和联合,在联合和结构嵌套时很有用,例如:在UTF-8
  • 静态断言,在译员理解类型时,在getsgets_s之后的阶段进行翻译时进行评估。
  • struct T { int tag; union { float x; int n; }; };的独占创建和打开模式(#if后缀)。其行为类似于#error中的"…x",通常用于锁定文件。
  • open函数作为终止程序的第三种方式,如果O_CREAT|O_EXCL终止失败,则至少要进行最小的取消初始化。
  • 用于构造复杂值的宏(部分原因是POSIX如果quick_exit为无限或exit,则real + imaginary*I可能无法产生预期值。

答案 1 :(得分:6)

根据C 2011 standard本身,以下是C99的主要变化:

前言
...
6第三版取消并取代第二版,ISO / IEC 9899:1999,as 经ISO / IEC 9899:1999 / Cor 1:2001,ISO / IEC 9899:1999 / Cor 2:2004修正,和 ISO / IEC 9899:1999 / Cor 3:2007。上一版的主要变化包括:

- 有条件(可选)功能(包括之前强制执行的功能)

- 支持多线程执行,包括改进的内存排序 模型,原子对象和线程局部存储( <stdatomic.h> 和 的 <threads.h>

- 其他浮点特征宏( <float.h>

- 查询和指定对象的对齐方式( <stdalign.h> <stdlib.h>

- Unicode字符和字符串( <uchar.h> )(最初在 ISO / IEC TR 19769:2004)

- 类型通用表达式

- 静态断言

- 匿名结构和工会

- 无返回功能

- 用于创建复数的宏( <complex.h>

- 支持打开专用访问文件

- 删除了 gets 功能( <stdio.h>

- 添加了 aligned_alloc at_quick_exit quick_exit 功能 (的 <stdlib.h>

- (条件)支持边界检查接口(最初在 ISO / IEC TR 24731-1:2007)

- (有条件的)支持可分析性