ISO C: Difference between revisions

From dankwiki
(C11 atomics)
No edit summary
Tags: Mobile edit Mobile web edit
Line 6: Line 6:
* I'd like to further along [http://gcc.gnu.org/c99status.html gcc C99 support]
* I'd like to further along [http://gcc.gnu.org/c99status.html gcc C99 support]


==Threads==
==Concurrency==
* Hans Boehm's [http://www.hpl.hp.com/personal/Hans_Boehm/c++mm/ Threads and Memory Model for C++] page is awesome
* Hans Boehm's [http://www.hpl.hp.com/personal/Hans_Boehm/c++mm/ Threads and Memory Model for C++] page is awesome
===Atomics===
Introduced in C11, and exposed by <tt>stdatomic.h</tt>. Use <tt>_Atomic</tt> as a type specifier (ala <tt>volatile</tt> or <tt>const</tt>).
* Unlike other type specifiers, an atomic form of a base type might have different size/alignment than the base type.
* <tt>struct</tt>s and <tt>union</tt>s 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==
==Aliasing==
Line 15: Line 21:
** How to use Berkeley sockets API? See http://archives.free.net.ph/message/20080529.200047.b40321b6.fi.html, etc
** How to use Berkeley sockets API? See http://archives.free.net.ph/message/20080529.200047.b40321b6.fi.html, etc


==stdint.h==
==Types==
===stdint.h===
An excellent addition in C99. Type constructions of the form u?int{variety}_t (u prefix denotes unsigned). Varieties include:
An excellent addition in C99. Type constructions of the form u?int{variety}_t (u prefix denotes unsigned). Varieties include:
* <tt>ptr</tt>: 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 <tt>void *</tt>'s size is not directly related to an <tt>int</tt>'s size by the ANSI C standard).
* <tt>ptr</tt>: 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 <tt>void *</tt>'s size is not directly related to an <tt>int</tt>'s size by the ANSI C standard).
Line 22: 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.
 
===tgmath.h===
==Atomics==
===_Generic===
Introduced in C11, and exposed by <tt>stdatomic.h</tt>. Use <tt>_Atomic</tt> as a type specifier (ala <tt>volatile</tt> or <tt>const</tt>).
C11 introduced the new keyword <tt>[https://en.cppreference.com/w/c/language/generic _Generic]</tt>, allowing one of several type-tagged expressions to be chosen based on the type of a controlling expression.
* Unlike other type specifiers, an atomic form of a base type might have different size/alignment than the base type.
* <tt>struct</tt>s and <tt>union</tt>s 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."

Revision as of 14:08, 8 February 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.

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.