C语言 c99和c11的区别

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/38405260/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 10:26:29  来源:igfitidea点击:

difference between c99 and c11

cc99c11

提问by I am not good at finding name

I am learning c, presently. The bookI read is C99 based. I want to update my knowledge to C11 after finishing this book, or change resource if there is a major difference. Thus, what I ask is for is an explanation or resource to update my knowledge. I only found this source. Nevertheless, it does not seem to encompass the information I need or not concise.

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

Thanks in advance. P.S: I want to learn C11 since I think it is the prevalent standard now. If not, please inform me.

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

回答by Evgeny Karkan

Good overviews of C11 standard:

C11 标准的良好概述:

The standard includes several changes to the C99 language and library specifications, such as:

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

  • Alignment specification (_Alignasspecifier, _Alignofoperator, aligned_allocfunction, <stdalign.h>header file)
  • The _Noreturnfunction specifier and the <stdnoreturn.h>header file
  • Type-generic expressions using the _Generickeyword. For example, the following macro cbrt(x)translates to cbrtl(x), cbrt(x)or cbrtf(x)depending on the type of x:

    #define cbrt(x) _Generic((x), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(x)
    
  • Multi-threading support (_Thread_localstorage-class specifier, <threads.h>header including thread creation/management functions, mutex, condition variable and thread-specific storage functionality, as well as the _Atomictype qualifier and <stdatomic.h>for uninterruptible object access).

  • Improved Unicode support based on the C Unicode Technical Report ISO/IEC TR 19769:2004 (char16_tand char32_ttypes for storing UTF-16/UTF-32encoded data, including conversion functions in <uchar.h>and the corresponding u and U string literal prefixes, as well as the u8 prefix for UTF-8encoded literals).
  • Removal of the getsfunction, deprecated in the previous C language standard revision, ISO/IEC 9899:1999/Cor.3:2007(E), in favor of a new safe alternative, gets_s.
  • Bounds-checking interfaces (Annex K).
  • Analyzability features (Annex L).
  • More macros for querying the characteristics of floating point types, concerning subnormal floating point numbers and the number of decimal digits the type is able to store.
  • Anonymous structures and unions, useful when unions and structures are nested, e.g. in struct T { int tag; union { float x; int n; }; };.
  • Static assertions, which are evaluated during translation at a later phase than #ifand #error, when types are understood by the translator.
  • An exclusive create-and-open mode ("…x"suffix) for open. This behaves like O_CREAT|O_EXCLin POSIX, which is commonly used for lock files.
  • The quick_exitfunction as a third way to terminate a program, intended to do at least minimal deinitialization if termination with exitfails.
  • Macros for the construction of complex values (partly because real + imaginary*Imight not yield the expected value if imaginaryis infinite or NaN).
  • 对齐规范(_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>头包括线程创建/管理函数、互斥锁、条件变量和线程特定的存储功能,以及_Atomic类型限定符和<stdatomic.h>用于不间断对象访问)。

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

回答by John Bode

Per the C 2011 standarditself, here are the major changes from C99:

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

Foreword
...
6     This third edition cancels and replaces the second edition, ISO/IEC 9899:1999, as corrected by ISO/IEC 9899:1999/Cor 1:2001, ISO/IEC 9899:1999/Cor 2:2004, and ISO/IEC 9899:1999/Cor 3:2007. Major changes from the previous edition include:

     — conditional (optional) features (including some that were previously mandatory)

     — support for multiple threads of execution including an improved memory sequencing model, atomic objects, and thread-local storage (<stdatomic.h>and <threads.h>)

     — additional floating-point characteristic macros (<float.h>)

     — querying and specifying alignment of objects (<stdalign.h>, <stdlib.h>)

     — Unicode characters and strings (<uchar.h>) (originally specified in ISO/IEC TR 19769:2004)

     — type-generic expressions

     — static assertions

     — anonymous structures and unions

     — no-return functions

     — macros to create complex numbers (<complex.h>)

     — support for opening files for exclusive access

     — removed the getsfunction (<stdio.h>)

     — added the aligned_alloc, at_quick_exit, and quick_exitfunctions (<stdlib.h>)

     — (conditional) support for bounds-checking interfaces (originally specified in ISO/IEC TR 24731?1:2007)

     — (conditional) support for analyzability
前言
...
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>

     — 额外的浮动-point 特征宏 ( <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 中指定)

     —(条件)支持可分析性