17 Language support library [support]

17.14 C headers [support.c.headers]

17.14.1 General [support.c.headers.general]

For compatibility with the C standard library, the C++ standard library provides the C headers shown in Table 44.
The intended use of these headers is for interoperability only.
It is possible that C++ source files need to include one of these headers in order to be valid C. Source files that are not intended to also be valid C should not use any of the C headers.
[Note 1: 
The C headers either have no effect, such as <stdbool.h> and <stdalign.h>, or otherwise the corresponding header of the form <cname> provides the same facilities and assuredly defines them in namespace std.
β€” end note]
[Example 1: 
The following source file is both valid C++ and valid C. Viewed as C++, it declares a function with C language linkage; viewed as C it simply declares a function (and provides a prototype).
#include <stdbool.h> // for bool in C, no effect in C++ #include <stddef.h> // for size_t #ifdef __cplusplus // see [cpp.predefined] extern "C" // see [dcl.link] #endif void f(bool b[], size_t n); β€” end example]
Table 44: C headers [tab:c.headers]
<assert.h>
<inttypes.h>
<signal.h>
<stddef.h>
<time.h>
<ctype.h>
<limits.h>
<stdarg.h>
<stdint.h>
<uchar.h>
<errno.h>
<locale.h>
<stdio.h>
<wchar.h>
<fenv.h>
<math.h>
<stdlib.h>
<wctype.h>
<float.h>
<setjmp.h>
<string.h>

17.14.2 Header <complex.h> synopsis [complex.h.syn]

#include <complex>
The header <complex.h> behaves as if it simply includes the header <complex>.
[Note 1: 
Names introduced by <complex> in namespace std are not placed into the global namespace scope by <complex.h>.
β€” end note]

17.14.3 Header <iso646.h> synopsis [iso646.h.syn]

The C++ header <iso646.h> is empty.
[Note 1: 
and, and_eq, bitand, bitor, compl, not_eq, not, or, or_eq, xor, and xor_eq are keywords in C++ ([lex.key]).
β€” end note]

17.14.4 Header <stdalign.h> synopsis [stdalign.h.syn]

The contents of the C++ header <stdalign.h> are the same as the C standard library header <stdalign.h>, with the following changes: The header <stdalign.h> does not define a macro named alignas.
See also: ISO/IEC 9899:2018, 7.15

17.14.5 Header <stdbool.h> synopsis [stdbool.h.syn]

The contents of the C++ header <stdbool.h> are the same as the C standard library header <stdbool.h>, with the following changes: The header <stdbool.h> does not define macros named bool, true, or false.
See also: ISO/IEC 9899:2018, 7.18

17.14.6 Header <tgmath.h> synopsis [tgmath.h.syn]

#include <cmath> #include <complex>
The header <tgmath.h> behaves as if it simply includes the headers <cmath> and <complex>.
[Note 1: 
The overloads provided in C by type-generic macros are already provided in <complex> and <cmath> by β€œsufficient” additional overloads.
β€” end note]
[Note 2: 
Names introduced by <cmath> or <complex> in namespace std are not placed into the global namespace scope by <tgmath.h>.
β€” end note]

17.14.7 Other C headers [support.c.headers.other]

Every C header other than <complex.h>, <iso646.h>, <stdalign.h>,
<stdatomic.h>, <stdbit.h>, <stdbool.h>, <stdckdint.h>, and
<tgmath.h>, each of which has a name of the form <name.h>, behaves as if each name placed in the standard library namespace by the corresponding <cname> header is placed within the global namespace scope, except for the functions described in [sf.cmath], the std​::​lerp function overloads ([c.math.lerp]), the declaration of std​::​byte ([cstddef.syn]), and the functions and function templates described in [support.types.byteops].
It is unspecified whether these names are first declared or defined within namespace scope ([basic.scope.namespace]) of the namespace std and are then injected into the global namespace scope by explicit using-declarations ([namespace.udecl]).
[Example 1: 
The header <cstdlib> assuredly provides its declarations and definitions within the namespace std.
It may also provide these names within the global namespace.
The header <stdlib.h> assuredly provides the same declarations and definitions within the global namespace, much as in ISO/IEC 9899.
It may also provide these names within the namespace std.
β€” end example]