Check out my first novel, midnight's simulacra!

ISO C

From dankwiki
(Redirected from ISO C18)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Compilers

gcc

Concurrency

Atomics

Introduced in C11, and exposed by stdatomic.h. Use _Atomic as a type specifier (ala volatile or const).

  • Unlike other type specifiers, an atomic form of a base type might have different size/alignment than the base type.
  • structs and unions may be declared atomic, but it is then undefined behavior to access any of their members.
  • Implementations are "encouraged to ensure that representation of C and C++ atomic types is the same."

Asserts

  • _Static_assert() is evaluated at compile time, huzzah!

Generic dispatch

The new _Genetic keyword allows mapping the type of an expression to a set of expressions. This is mainly usable for type-based dispatch of the kind seen in tgmath.h. You can't, so far as I can tell, use it for true parametric polymorphism. Tony Finch demonstrates a clever use for parametric constness:

   #define strchr(s,c) _Generic((s),                    \
       const char * : (const char *)(strchr)((s), (c)), \
       char *       :               (strchr)((s), (c)))

Types

Aliasing


stdint.h

An excellent addition in C99. Type constructions of the form u?int{variety}_t (u prefix denotes unsigned). Varieties include:

  • ptr: Size sufficient to hold a pointer. This is useful for function type definitions, when it's unsure whether a pointer or integer type would be most appropriate for various instances (a void *'s size is not directly related to an int's size by the ANSI C standard).
  • max: Size sufficient to hold any other integer type.
  • fast{8,16,32,64}: Fastest integer type having at least the specified width.
  • least{8,16,32,64}: Minimum native integer type having at least the specified width.
  • {8,16,32,64}: Integer type having precisely this width.

inttypes.h

ugly printf specifiers for the types in stdint.h. e.g.:

  • printf("%"PRIu64"\n", some_uint64_tvar);

tgmath.h

static in array parameters

Beginning with C99, static can be inserted into array parameters ala:

void foo(int bararr[static 10]);

This indicates to the compiler that the array passed as bararr must have room for at least 10 elements. This ought help it produce diagnostics, and perhaps help code generation.