Search code examples
cc99c11

difference between c99 and c11


I am learning c, presently. The book I 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.

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


Solution

  • Good overviews of C11 standard:

    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 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 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 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).
    • 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) for open. 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 if termination with exit fails.
    • Macros for the construction of complex values (partly because real + imaginary*I might not yield the expected value if imaginary is infinite or NaN).