Check out my first novel, midnight's simulacra!

ISO C: Difference between revisions

From dankwiki
m (Dank moved page ISO C18 to ISO C: (1) it's C17 apparently(?) (2) future proofing)
Line 29: Line 29:
* <tt>least{8,16,32,64}</tt>: Minimum native integer type having at least the specified width.
* <tt>least{8,16,32,64}</tt>: Minimum native integer type having at least the specified width.
* <tt>{8,16,32,64}</tt>: Integer type having precisely this width.
* <tt>{8,16,32,64}</tt>: Integer type having precisely this width.
====inttypes.h====
ugly <tt>printf</tt> specifiers for the types in <tt>stdint.h</tt>. e.g.:
* <tt>printf("%"PRIu64"\n", some_uint64_tvar);</tt>
===tgmath.h===
===tgmath.h===
===_Generic===
===_Generic===

Revision as of 10:13, 29 July 2021

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."

Aliasing

Types

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

_Generic

C11 introduced the new keyword _Generic, allowing one of several type-tagged expressions to be chosen based on the type of a controlling expression.

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.