6 Using the GNU Compiler Collection (GCC)
features that are part of the C99 standard are accepted as extensions in C90 mode, and
some features that are part of the C11 standard are accepted as extensions in C90 and C99
modes.
The ISO C standard defines (in clause 4) two classes of conforming implementation. A
conforming hosted implementation supports the whole standard including all the library fa-
cilities; a conforming freestanding implementation is only required to provide certain library
facilities: those in <float.h>, <limits.h>, <stdarg.h>, and <stddef.h>; since AMD1,
also those in <iso646.h>; since C99, also those in <stdbool.h> and <stdint.h>; and since
C11, also those in <stdalign.h> and <stdnoreturn.h>. In addition, complex types, added
in C99, are not required for freestanding implementations. The standard also defines two
environments for programs, a freestanding environment, required of all implementations and
which may not have library facilities beyond those required of freestanding implementations,
where the handling of program startup and termination are implementation-defined, and a
hosted environment, which is not required, in which all the library facilities are provided
and startup is through a function int main (void) or int main (int, char *[]). An OS
kernel would be a freestanding environment; a program using the facilities of an operating
system would normally be in a hosted implementation.
GCC aims towards being usable as a conforming freestanding implementation, or as the
compiler for a conforming hosted implementation. By default, it will act as the compiler for a
hosted implementation, defining __STDC_HOSTED__ as 1 and presuming that when the names
of ISO C functions are used, they have the semantics defined in the standard. To make it act
as a conforming freestanding implementation for a freestanding environment, use the option
‘-ffreestanding’; it will then define __STDC_HOSTED__ to 0 and not make assumptions
about the meanings of function names from the standard library, with exceptions noted
below. To build an OS kernel, you may well still need to make your own arrangements for
linking and startup. See Section 3.4 [Options Controlling C Dialect], page 30.
GCC does not provide the library facilities required only of hosted implementations, nor
yet all the facilities required by C99 of freestanding implementations; to use the facilities
of a hosted environment, you will need to find them elsewhere (for example, in the GNU C
library). See Section 11.5 [Standard Libraries], page 690.
Most of the compiler support routines used by GCC are present in ‘libgcc’, but there
are a few exceptions. GCC requires the freestanding environment provide memcpy, memmove,
memset and memcmp. Finally, if __builtin_trap is used, and the target does not implement
the trap pattern, then GCC will emit a call to abort.
For references to Technical Corrigenda, Rationale documents and information concerning
the history of C that is available online, see http://gcc.gnu.org/readings.html
2.2 C++ language
GCC supports the original ISO C++ standard (1998) and contains experimental support for
the second ISO C++ standard (2011).
The original ISO C++ standard was published as the ISO standard (ISO/IEC 14882:1998)
and amended by a Technical Corrigenda published in 2003 (ISO/IEC 14882:2003). These
standards are referred to as C++98 and C++03, respectively. GCC implements the majority
of C++98 (export is a notable exception) and most of the changes in C++03. To select
this standard in GCC, use one of the options ‘-ansi’, ‘-std=c++98’, or ‘-std=c++03’; to