【问题标题】:difference between c99 and c11 [closed]c99和c11之间的区别[关闭]
【发布时间】:2016-07-15 21:27:02
【问题描述】:

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

提前致谢。 P.S:我想学习C11,因为我认为它是现在流行的标准。如果没有,请告诉我。

【问题讨论】:

  • 现阶段我觉得你不用太担心。
  • 嗯,有Wikipedia
  • 大约 12 年的改进,经过多次谈判。这主要意味着在特定情况下可能有用的附加功能;但是,为了保持 C 代码可移植到下一个版本,通常不太可能破坏您用 C99 编写的任何代码,否则他们会失去开发人员基础。

标签: c c99 c11


【解决方案1】:

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 终止失败时至少进行最少的取消初始化。
  • 用于构造复杂值的宏(部分原因是如果imaginary 是无限的或NaNreal + imaginary*I 可能不会产生预期值)。

【讨论】:

    【解决方案2】:

    根据 C 2011 standard 本身,以下是 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)

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

    【讨论】:

    • 链接是C11标准的N1570草案。在该草案和最终发布的标准之间进行了一些非常小的更改。
    • C11 标准本身只能购买,所以对于像我这样的人@JohnBode 和普通大众来说,N1570 是我们为 C11 获得的最好的(无需付费)。见ISO/IEC 9899 - Programming languages - C
    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2014-11-28
    • 2016-08-01
    • 2011-10-07
    • 2012-01-12
    相关资源
    最近更新 更多