C11 (C standard revision)
C11 is an informal name for ISO/IEC 9899:2011, a past standard for the C programming language. It replaced C99 and has been superseded by C18. 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.
The final draft, N1570, 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. Some features of C11 are supported by the GCC starting with version 4.6, Clang starting with version 3.1, and IBM XL C starting with version 12.1.Changes from C99
The standard includes several changes to the C99 language and library specifications, such as:- Alignment specification
- The
_Noreturn
function specifier and the<stdnoreturn.h>
header file - Type-generic expressions using the
_Generic
keyword. For example, the following macrocbrt
translates tocbrtl
,cbrt
orcbrtf
depending on the type ofx
:
- define cbrt _Generic, long double: cbrtl, \
float: cbrtf)
- Multi-threading support.
- Improved Unicode support based on the C Unicode Technical Report ISO/IEC TR 19769:2004.
- Removal of the
gets
function, deprecated in the previous C language standard revision, ISO/IEC 9899:1999/Cor.3:2007. - Bounds-checking interfaces.
- Analyzability features.
- 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.
- 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 for
fopen
. This behaves likeO_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 if termination withexit
fails. - A new
timespec_get
function and corresponding structure in<time.h>
with a degree of POSIX compatibility. - Macros for the construction of complex values.
Optional features
Feature | Feature test macro | Availability in C99 |
Analyzability | __STDC_ANALYZABLE__ | |
Bounds-checking interfaces | __STDC_LIB_EXT1__ | |
Multithreading | __STDC_NO_THREADS__ | |
Atomic primitives and types | __STDC_NO_ATOMICS__ | |
IEC 60559 floating-point arithmetic | __STDC_IEC_559__ | |
IEC 60559 compatible complex arithmetic | __STDC_IEC_559_COMPLEX__ | |
Complex types | __STDC_NO_COMPLEX__ | |
Variable length arrays | __STDC_NO_VLA__ |