c99和c11之间的差异

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

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

C11标准的良好概述:

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

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

     #define cbrt(x) _Generic((x), long double: cbrtl, \ default: cbrt, \ float: cbrtf)(x) 
  • multithreading支持( _Thread_local存储类说明符, 头文件,包括线程创建/管理函数,互斥锁,条件变量和特定于线程的存储function,以及类型限定符和用于不间断对象访问)。

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

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

前言

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

– 条件(可选)function(包括之前必需的function)

– 支持多个执行线程,包括改进的内存排序模型,primefaces对象和线程局部存储(

– 附加的浮点特征宏(

– 查询和指定对象的对齐方式(

– Unicode字符和字符串( )(最初在ISO / IEC TR 19769:2004中指定)

– 类型通用表达式

– 静态断言

– 匿名结构和工会

– 无回报function

– 用于创建复数的宏(

– 支持打开文件以进行独占访问

– 删除了gets函数(

– 添加了aligned_allocat_quick_exitquick_exit函数(

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

– (有条件)支持可分析性