C99和C11之间的区别

41
我目前正在学习C语言。我读的是基于C99的书籍(The book)。在完成这本书后,我想更新我的知识到C11,或者如果有很大的区别,更换资源。因此,我所要求的是一个解释或资源来更新我的知识。我只发现了这个来源。然而,它似乎没有涵盖我需要的信息,或者不够简洁明了。
提前致谢。 附言:我想学习C11,因为我认为它是当前普遍使用的标准。如果不是,请告知我。

7
目前阶段我认为你不应该过多担心这件事情。 - Eugene Sh.
2
好的,这里有Wikipedia - yellowantphil
经过大量的谈判和12年的改进,这主要意味着增加了一些特定情况下有用的功能;但是为了保持C代码可移植性到下一个版本,这些功能大多不太可能破坏您在C99中编写的任何代码,否则它们将失去开发者基础。 - Edwin Buck
2个回答

44

关于C11标准的好概述:

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

  • 对齐规范(_Alignas说明符,_Alignof运算符,aligned_alloc函数,<stdalign.h>头文件)
  • _Noreturn函数说明符和<stdnoreturn.h>头文件
  • 使用_Generic关键字的类型通用表达式。例如,以下宏cbrt(x)根据x的类型将翻译为cbrtl(x)cbrt(x)cbrtf(x)

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

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

9
根据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。与上一版相比,本版的主要变化包括:

     — 条件(可选)功能(包括以前强制性的某些功能)

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

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

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

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

     — 类型通用表达式

     — 静态断言

     — 匿名结构和联合

     — 无返回函数

     — 创建复数的宏 (<complex.h>)

     — 支持以独占方式打开文件

     — 删除 gets 函数 (<stdio.h>)

     — 添加了 aligned_allocat_quick_exitquick_exit 函数(<stdlib.h>)

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

     — (条件) 支持可分析性

3
链接是C11标准的N1570草案。该草案与最终发布的标准之间只有一些非常小的更改。 - Keith Thompson
3
C11标准本身只能购买,因此像我、@JohnBode和普通公众一样,N1570是我们可以免费获得的最好的C11参考资料。请参见ISO/IEC 9899 - Programming languages - C - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接