[diff.library]

# Annex C (informative) Compatibility [[diff]](./#diff)

## C.8 C standard library [diff.library]

### [C.8.1](#general) General [[diff.library.general]](diff.library.general)

[1](#general-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3683)

Subclause [diff.library] summarizes the explicit changes in headers,
definitions, declarations, or behavior between the C standard library
in the C standard and the parts of the C++ standard library that were
included from the C standard library[.](#general-1.sentence-1)

### [C.8.2](#diff.mods.to.headers) Modifications to headers [[diff.mods.to.headers]](diff.mods.to.headers)

[1](#diff.mods.to.headers-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3691)

For compatibility with the C standard library,
the C++ standard library provides the C headers enumerated
in [[support.c.headers]](support.c.headers "17.15 C headers")[.](#diff.mods.to.headers-1.sentence-1)

[2](#diff.mods.to.headers-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3696)

There are no C++ headers for the C standard library's headers<stdnoreturn.h> and <threads.h>,
nor are these headers from the C standard library headers themselves part of C++[.](#diff.mods.to.headers-2.sentence-1)

[3](#diff.mods.to.headers-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3701)

The C headers [<complex.h>](complex.h.syn#header:%3ccomplex.h%3e "17.15.2 Header <complex.h> synopsis [complex.h.syn]") and[<tgmath.h>](tgmath.h.syn#header:%3ctgmath.h%3e "17.15.6 Header <tgmath.h> synopsis [tgmath.h.syn]") do not contain any of the content from
the C standard library and instead merely include other headers from the C++
standard library[.](#diff.mods.to.headers-3.sentence-1)

### [C.8.3](#diff.mods.to.definitions) Modifications to definitions [[diff.mods.to.definitions]](diff.mods.to.definitions)

#### [C.8.3.1](#diff.char16) Types char8_t, char16_t, and char32_t [[diff.char16]](diff.char16)

[1](#diff.char16-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3711)

The types char8_t, char16_t, and char32_t are distinct types rather than typedefs to existing integral types[.](#diff.char16-1.sentence-1)

The tokens char8_t, char16_t, and char32_t are keywords in C++ ([[lex.key]](lex.key "5.12 Keywords"))[.](#diff.char16-1.sentence-2)

They do not appear as macro or type names defined in[<cuchar>](cuchar.syn#header:%3ccuchar%3e "28.7.4 Header <cuchar> synopsis [cuchar.syn]")[.](#diff.char16-1.sentence-3)

#### [C.8.3.2](#diff.wchar.t) Type wchar_t [[diff.wchar.t]](diff.wchar.t)

[1](#diff.wchar.t-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3721)

The type wchar_t is a distinct type rather than a typedef to an
existing integral type[.](#diff.wchar.t-1.sentence-1)

The token wchar_t is a keyword in C++ ([[lex.key]](lex.key "5.12 Keywords"))[.](#diff.wchar.t-1.sentence-2)

It does not appear as a macro or type name defined in any of[<cstddef>](cstddef.syn#header:%3ccstddef%3e "17.2.1 Header <cstddef> synopsis [cstddef.syn]"),[<cstdlib>](cstdlib.syn#header:%3ccstdlib%3e "17.2.2 Header <cstdlib> synopsis [cstdlib.syn]"),
or [<cwchar>](cwchar.syn#header:%3ccwchar%3e "28.7.3 Header <cwchar> synopsis [cwchar.syn]")[.](#diff.wchar.t-1.sentence-3)

#### [C.8.3.3](#diff.header.iso646.h) Header <iso646.h> [[diff.header.iso646.h]](diff.header.iso646.h)

[1](#diff.header.iso646.h-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3733)

The tokensand,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,
andxor_eq are keywords in C++ ([[lex.key]](lex.key "5.12 Keywords")),
and are not introduced as macros
by [<iso646.h>](iso646.h.syn#header:%3ciso646.h%3e "17.15.3 Header <iso646.h> synopsis [iso646.h.syn]")[.](#diff.header.iso646.h-1.sentence-1)

#### [C.8.3.4](#diff.null) Macro NULL [[diff.null]](diff.null)

[1](#diff.null-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3753)

The macroNULL,
defined in any of[<clocale>](clocale.syn#header:%3cclocale%3e "28.3.5.1 Header <clocale> synopsis [clocale.syn]"),[<cstddef>](cstddef.syn#header:%3ccstddef%3e "17.2.1 Header <cstddef> synopsis [cstddef.syn]"),[<cstdio>](cstdio.syn#header:%3ccstdio%3e "31.13.1 Header <cstdio> synopsis [cstdio.syn]"),[<cstdlib>](cstdlib.syn#header:%3ccstdlib%3e "17.2.2 Header <cstdlib> synopsis [cstdlib.syn]"),[<cstring>](cstring.syn#header:%3ccstring%3e "27.5.1 Header <cstring> synopsis [cstring.syn]"),[<ctime>](ctime.syn#header:%3cctime%3e "30.15 Header <ctime> synopsis [ctime.syn]"),
or [<cwchar>](cwchar.syn#header:%3ccwchar%3e "28.7.3 Header <cwchar> synopsis [cwchar.syn]"),
is an implementation-defined null pointer constant in
C++ ([[support.types]](support.types "17.2 Common definitions"))[.](#diff.null-1.sentence-1)

### [C.8.4](#diff.mods.to.declarations) Modifications to declarations [[diff.mods.to.declarations]](diff.mods.to.declarations)

[1](#diff.mods.to.declarations-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3769)

Header [<cstring>](cstring.syn#header:%3ccstring%3e "27.5.1 Header <cstring> synopsis [cstring.syn]"):
The following functions have different declarations:

- [(1.1)](#diff.mods.to.declarations-1.1)

strchr

- [(1.2)](#diff.mods.to.declarations-1.2)

strpbrk

- [(1.3)](#diff.mods.to.declarations-1.3)

strrchr

- [(1.4)](#diff.mods.to.declarations-1.4)

strstr

- [(1.5)](#diff.mods.to.declarations-1.5)

memchr

Subclause [[cstring.syn]](cstring.syn "27.5.1 Header <cstring> synopsis") describes the changes[.](#diff.mods.to.declarations-1.sentence-2)

[2](#diff.mods.to.declarations-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3782)

Header [<cwchar>](cwchar.syn#header:%3ccwchar%3e "28.7.3 Header <cwchar> synopsis [cwchar.syn]"):
The following functions have different declarations:

- [(2.1)](#diff.mods.to.declarations-2.1)

wcschr

- [(2.2)](#diff.mods.to.declarations-2.2)

wcspbrk

- [(2.3)](#diff.mods.to.declarations-2.3)

wcsrchr

- [(2.4)](#diff.mods.to.declarations-2.4)

wcsstr

- [(2.5)](#diff.mods.to.declarations-2.5)

wmemchr

Subclause [[cwchar.syn]](cwchar.syn "28.7.3 Header <cwchar> synopsis") describes the changes[.](#diff.mods.to.declarations-2.sentence-2)

[3](#diff.mods.to.declarations-3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3795)

Header [<cstddef>](cstddef.syn#header:%3ccstddef%3e "17.2.1 Header <cstddef> synopsis [cstddef.syn]") declares the names nullptr_t, byte, and to_integer,
and the operators and operator templates in [[support.types.byteops]](support.types.byteops "17.2.5 byte type operations"),
in addition to the names declared in[<stddef.h>](support.c.headers.general#header:%3cstddef.h%3e "17.15.1 General [support.c.headers.general]") in the C standard library[.](#diff.mods.to.declarations-3.sentence-1)

### [C.8.5](#diff.mods.to.behavior) Modifications to behavior [[diff.mods.to.behavior]](diff.mods.to.behavior)

#### [C.8.5.1](#diff.mods.to.behavior.general) General [[diff.mods.to.behavior.general]](diff.mods.to.behavior.general)

[1](#diff.mods.to.behavior.general-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3806)

Header [<cstdlib>](cstdlib.syn#header:%3ccstdlib%3e "17.2.2 Header <cstdlib> synopsis [cstdlib.syn]"):
The following functions have different behavior:

- [(1.1)](#diff.mods.to.behavior.general-1.1)

atexit

- [(1.2)](#diff.mods.to.behavior.general-1.2)

exit

- [(1.3)](#diff.mods.to.behavior.general-1.3)

abort

Subclause [[support.start.term]](support.start.term "17.5 Startup and termination") describes the changes[.](#diff.mods.to.behavior.general-1.sentence-2)

[2](#diff.mods.to.behavior.general-2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3817)

Header [<csetjmp>](csetjmp.syn#header:%3ccsetjmp%3e "17.14.3 Header <csetjmp> synopsis [csetjmp.syn]"):
The following functions have different behavior:

- [(2.1)](#diff.mods.to.behavior.general-2.1)

longjmp

Subclause [[csetjmp.syn]](csetjmp.syn "17.14.3 Header <csetjmp> synopsis") describes the changes[.](#diff.mods.to.behavior.general-2.sentence-2)

#### [C.8.5.2](#diff.offsetof) Macro offsetof(*type*, *member-designator*) [[diff.offsetof]](diff.offsetof)

[1](#diff.offsetof-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3829)

The macro offsetof, defined in[<cstddef>](cstddef.syn#header:%3ccstddef%3e "17.2.1 Header <cstddef> synopsis [cstddef.syn]"),
accepts a restricted set of *type* arguments in C++[.](#diff.offsetof-1.sentence-1)

Subclause [[support.types.layout]](support.types.layout "17.2.4 Sizes, alignments, and offsets") describes the change[.](#diff.offsetof-1.sentence-2)

#### [C.8.5.3](#diff.malloc) Memory allocation functions [[diff.malloc]](diff.malloc)

[1](#diff.malloc-1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3837)

The functionsaligned_alloc,calloc,malloc,
andrealloc are restricted in C++[.](#diff.malloc-1.sentence-1)

Subclause [[c.malloc]](c.malloc "20.2.12 C library memory allocation") describes the changes[.](#diff.malloc-1.sentence-2)
