difference between c99 and c11
Per the C 2011 standard itself, here are the major changes from 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 thegets
function (<stdio.h>
)
— added thealigned_alloc
,at_quick_exit
, andquick_exit
functions (<stdlib.h>
)
— (conditional) support for bounds-checking interfaces (originally specified in ISO/IEC TR 24731−1:2007)
— (conditional) support for analyzability
Good overviews of C11 standard:
- https://en.wikipedia.org/wiki/C11_(C_standard_revision)
- http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
- https://smartbear.com/blog/test-and-monitor/c11-a-new-c-standard-aiming-at-safer-programming/
The standard includes several changes to the C99 language and library specifications, such as:
- Alignment specification (
_Alignas
specifier,_Alignof
operator,aligned_alloc
function,<stdalign.h>
header file) - The
_Noreturn
function specifier and the<stdnoreturn.h>
header file Type-generic expressions using the
_Generic
keyword. For example, the following macrocbrt(x)
translates tocbrtl(x)
,cbrt(x)
orcbrtf(x)
depending on the type ofx
:#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 the_Atomic
type qualifier and<stdatomic.h>
for uninterruptible object access).- Improved Unicode support based on the C Unicode Technical Report ISO/IEC TR 19769:2004 (
char16_t
andchar32_t
types for storingUTF-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 forUTF-8
encoded literals). - Removal of the
gets
function, 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
#if
and#error
, when types are understood by the translator. - An exclusive create-and-open mode (
"…x"
suffix) foropen
. This behaves likeO_CREAT|O_EXCL
inPOSIX
, 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. - Macros for the construction of complex values (partly because
real + imaginary*I
might not yield the expected value ifimaginary
is infinite orNaN
).