C11 (C standard revision)

Source: Wikipedia, the free encyclopedia.

C11 (formerly C1X) is an informal name for ISO/IEC 9899:2011,

threads of execution. Due to delayed availability of conforming C99 implementations, C11 makes certain features optional, to make it easier to comply with the core language standard.[2][3]

The final draft, N1570,[4] was published in April 2011. The new standard passed its final draft review on October 10, 2011 and was officially ratified by ISO and published as ISO/IEC 9899:2011 on December 8, 2011, with no comments requiring resolution by participating national bodies.

A standard macro __STDC_VERSION__ is defined with value 201112L to indicate that C11 support is available.[5]

Changes from C99

The standard includes several changes to the C99 language and library specifications, such as[6]

  • Alignment specification (_Alignas specifier, _Alignof operator, aligned_alloc function, <stdalign.h> header)
  • The _Noreturn function specifier and the <stdnoreturn.h> header
  • Type-generic expressions using the _Generic keyword. 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)
  • condition variable and thread-specific storage functionality, as well as <stdatomic.h>[7]
    for atomic operations supporting the C11 memory model).
  • Improved Unicode support based on the C Unicode Technical Report ISO/IEC TR 19769:2004 (char16_t and char32_t types for storing UTF-16/UTF-32 encoded data, including conversion functions in <uchar.h> and the corresponding u and U string literal prefixes, as well as the u8 prefix for UTF-8 encoded literals).[8]
  • Removal of the
    gets
    function (in favor of safer fgets), which was deprecated in the previous C language standard revision, ISO/IEC 9899:1999/Cor.3:2007(E).
  • Bounds-checking interfaces (Annex K).[9]
  • 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 #if and #error, when types are understood by the translator.
  • An exclusive create-and-open mode ("…x" suffix) for fopen. This behaves like O_CREAT|O_EXCL in POSIX, which is commonly used for lock files.
  • The quick_exit function as a third way to terminate a program, intended to do at least minimal deinitialization.[10]
  • A new timespec_get function and corresponding structure in <time.h> with a degree of POSIX compatibility.
  • Macros for the construction of complex values (partly because real + imaginary*I might not yield the expected value if imaginary is infinite or NaN).[11]

Optional features

The new revision allows implementations to not support certain parts of the standard — including some that had been mandatory to support in the 1999 revision.[12] Programs can use predefined macros to determine whether an implementation supports a certain feature or not.

Optional features in C11
Feature Feature test macro Availability in C99[13]
Analyzability (Annex L) __STDC_ANALYZABLE__ Not available
Bounds-checking interfaces (Annex K) __STDC_LIB_EXT1__ Not available
Multithreading (<threads.h>) __STDC_NO_THREADS__ Not available
Atomic primitives and types (<stdatomic.h> and the _Atomic type qualifier)[14] __STDC_NO_ATOMICS__ Not available
IEC 60559
floating-point arithmetic (Annex F)
__STDC_IEC_559__ Optional
IEC 60559
compatible complex arithmetic (Annex G)
__STDC_IEC_559_COMPLEX__ Optional
Complex types (<complex.h>) __STDC_NO_COMPLEX__ Mandatory for hosted implementations
Variable-length arrays[15] __STDC_NO_VLA__ Mandatory

Compiler support

Some features of C11 are supported by the

IBM XL C starting with version 12.1,[18] and Microsoft Visual C++ starting with VS 2019 (16.8)[19]
in September 2020.

Criticism

The optional bounds-checking interfaces (Annex K) remain controversial and have not been widely implemented, and their deprecation or removal from the next standard revision has been proposed.

Open Watcom C/C++'s "Safer C" library[23] and safeclib.[24]

See also

References

  1. ^ "ISO/IEC 9899:2011 - Information technology -- Programming languages -- C". www.iso.org.
  2. ^ "WG14 N1250 The C1X Charter" (PDF).
  3. ^ "Subsetting the C Standard". www.open-std.org.
  4. ^ WG14 N1570 Committee Draft — April 12, 2011
  5. ^ "Defect report #411". ISO/IEC JTC1/SC22/WG14 - C. February 2012. Retrieved 2012-05-04.
  6. ^ WG14 N1516 Committee Draft — October 4, 2010
  7. ^ "Atomic operations library - cppreference.com". en.cppreference.com.
  8. ^ "WG14 N1286 — "On Support for TR-19769 and New Character Types", Nick Stoughton, Larry Dwyer" (PDF).
  9. ^ Berin Babcock-McConnell. "API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size".
  10. ^ "Abandoning a Process". www.open-std.org.
  11. ^ "Creation of complex value". www.open-std.org.
  12. ^ WG14 N1548 Committee Draft — December 2, 2010 6.10.8.3 Conditional feature macros
  13. ^ ISO 9899:1999 6.10.8 Predefined macro names
  14. ^ "WG14 N1558 Mar 14-18 meeting minutes (draft)" (PDF).
  15. ^ ISO 9899:2011 Programming Languages - C 6.7.6.2 4
  16. ^ "GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)". gcc.gnu.org.
  17. ^ "Clang 3.1 Release Notes". llvm.org.
  18. ^ "Support for ISO C11 added to IBM XL C/C++ compilers". www.ibm.com. 17 April 2014.
  19. ^ "C11 and C17 Standard Support Arriving in MSVC". devblogs.microsoft.com. 14 September 2020.
  20. ^ "N1969 — Updated Field Experience With Annex K — Bounds Checking Interfaces". www.open-std.org.
  21. ^ Leffler, Jonathan. "c - Do you use the TR 24731 'safe' functions?". Stack Overflow.
  22. ^ "c - Do you use the TR 24731 'safe' functions?". Stack Overflow.
  23. ^ "Safer C Library - Open Watcom". 3 May 2015. Archived from the original on 2015-05-03.
  24. ^ "safec: Safe C Library - README". rurban.github.io.

Further reading

External links

Preceded by C language standards Succeeded by