Английская Википедия:C11 (C standard revision)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Distinguish Шаблон:Short description Шаблон:C language revisions

C11 (formerly C1X) is an informal name for ISO/IEC 9899:2011,[1] a past standard for the C programming language. It replaced C99 (standard ISO/IEC 9899:1999) and has been superseded by C17 (standard ISO/IEC 9899:2018). C11 mainly standardizes features already supported by common contemporary compilers, and includes a detailed memory model to better support multiple 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)
  • Multi-threading support (_Thread_local storage-class specifier, <threads.h> header including thread creation/management functions, mutex, 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 Шаблон:Code.
  • 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__ Шаблон:No
Bounds-checking interfaces (Annex K) __STDC_LIB_EXT1__ Шаблон:No
Multithreading (<threads.h>) __STDC_NO_THREADS__ Шаблон:No
Atomic primitives and types (<stdatomic.h> and the _Atomic type qualifier)[14] __STDC_NO_ATOMICS__ Шаблон:No
IEC 60559 floating-point arithmetic (Annex F) __STDC_IEC_559__ Шаблон:Partial
IEC 60559 compatible complex arithmetic (Annex G) __STDC_IEC_559_COMPLEX__ Шаблон:Partial
Complex types (<complex.h>) __STDC_NO_COMPLEX__ Шаблон:Yes
Variable-length arrays[15] __STDC_NO_VLA__ Шаблон:Yes

Compiler support

Some features of C11 are supported by the GCC starting with version 4.6,[16] Clang starting with version 3.1,[17] IBM XL C starting with version 12.1,[18] and Microsoft Visual C++ starting with VS 2019 (16.8)[19] in September 2020.

Criticism

Шаблон:See also 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.[20] Even Microsoft, a main proponent of this interface, does not conform to the definition.[21] In addition, Annex K does not include the more useful TR24731-2 (dynamic allocation functions), such as Шаблон:Code and Шаблон:Code.[22] The few open-source implementations include Open Watcom C/C++'s "Safer C" library[23] and safeclib.[24]

See also

Шаблон:Portal

References

Шаблон:Reflist

Further reading

External links

Шаблон:S-start Шаблон:S-bef Шаблон:S-ttl Шаблон:S-aft Шаблон:End

Шаблон:C programming language Шаблон:ISO standards

  1. Шаблон:Cite web
  2. Ошибка цитирования Неверный тег <ref>; для сносок N1250 не указан текст
  3. Шаблон:Cite web
  4. Ошибка цитирования Неверный тег <ref>; для сносок N1570 не указан текст
  5. Шаблон:Cite web
  6. Ошибка цитирования Неверный тег <ref>; для сносок N1516 не указан текст
  7. Шаблон:Cite web
  8. Ошибка цитирования Неверный тег <ref>; для сносок N1286 не указан текст
  9. Шаблон:Cite web
  10. Шаблон:Cite web
  11. Ошибка цитирования Неверный тег <ref>; для сносок N1464 не указан текст
  12. Ошибка цитирования Неверный тег <ref>; для сносок N1548-6-10-8-3 не указан текст
  13. Ошибка цитирования Неверный тег <ref>; для сносок ISO9899-1999-6-10-8 не указан текст
  14. Шаблон:Cite web
  15. ISO 9899:2011 Programming Languages - C 6.7.6.2 4
  16. Шаблон:Cite web
  17. Шаблон:Cite web
  18. Шаблон:Cite web
  19. Шаблон:Cite web
  20. Ошибка цитирования Неверный тег <ref>; для сносок N1969 не указан текст
  21. Шаблон:Cite web
  22. Шаблон:Cite web
  23. Шаблон:Cite web
  24. Шаблон:Cite web