| @c Copyright (C) 2000-2021 Free Software Foundation, Inc. |
| @c This is part of the GCC manual. |
| @c For copying conditions, see the file gcc.texi. |
| |
| @node Standards |
| @chapter Language Standards Supported by GCC |
| |
| For each language compiled by GCC for which there is a standard, GCC |
| attempts to follow one or more versions of that standard, possibly |
| with some exceptions, and possibly with some extensions. |
| |
| @section C Language |
| @cindex C standard |
| @cindex C standards |
| @cindex ANSI C standard |
| @cindex ANSI C |
| @cindex ANSI C89 |
| @cindex C89 |
| @cindex ANSI X3.159-1989 |
| @cindex X3.159-1989 |
| @cindex ISO C standard |
| @cindex ISO C |
| @cindex ISO C90 |
| @cindex ISO/IEC 9899 |
| @cindex ISO 9899 |
| @cindex C90 |
| @cindex ISO C94 |
| @cindex C94 |
| @cindex ISO C95 |
| @cindex C95 |
| @cindex ISO C99 |
| @cindex C99 |
| @cindex ISO C9X |
| @cindex C9X |
| @cindex ISO C11 |
| @cindex C11 |
| @cindex ISO C1X |
| @cindex C1X |
| @cindex ISO C17 |
| @cindex C17 |
| @cindex ISO C2X |
| @cindex C2X |
| @cindex Technical Corrigenda |
| @cindex TC1 |
| @cindex Technical Corrigendum 1 |
| @cindex TC2 |
| @cindex Technical Corrigendum 2 |
| @cindex TC3 |
| @cindex Technical Corrigendum 3 |
| @cindex AMD1 |
| @cindex freestanding implementation |
| @cindex freestanding environment |
| @cindex hosted implementation |
| @cindex hosted environment |
| @findex __STDC_HOSTED__ |
| |
| @opindex std |
| @opindex ansi |
| @opindex pedantic |
| @opindex pedantic-errors |
| The original ANSI C standard (X3.159-1989) was ratified in 1989 and |
| published in 1990. This standard was ratified as an ISO standard |
| (ISO/IEC 9899:1990) later in 1990. There were no technical |
| differences between these publications, although the sections of the |
| ANSI standard were renumbered and became clauses in the ISO standard. |
| The ANSI |
| standard, but not the ISO standard, also came with a Rationale |
| document. |
| This standard, in both its forms, is commonly known as @dfn{C89}, or |
| occasionally as @dfn{C90}, from the dates of ratification. |
| To select this standard in GCC, use one of the options |
| @option{-ansi}, @option{-std=c90} or @option{-std=iso9899:1990}; to obtain |
| all the diagnostics required by the standard, you should also specify |
| @option{-pedantic} (or @option{-pedantic-errors} if you want them to be |
| errors rather than warnings). @xref{C Dialect Options,,Options |
| Controlling C Dialect}. |
| |
| Errors in the 1990 ISO C standard were corrected in two Technical |
| Corrigenda published in 1994 and 1996. GCC does not support the |
| uncorrected version. |
| |
| An amendment to the 1990 standard was published in 1995. This |
| amendment added digraphs and @code{__STDC_VERSION__} to the language, |
| but otherwise concerned the library. This amendment is commonly known |
| as @dfn{AMD1}; the amended standard is sometimes known as @dfn{C94} or |
| @dfn{C95}. To select this standard in GCC, use the option |
| @option{-std=iso9899:199409} (with, as for other standard versions, |
| @option{-pedantic} to receive all required diagnostics). |
| |
| A new edition of the ISO C standard was published in 1999 as ISO/IEC |
| 9899:1999, and is commonly known as @dfn{C99}. (While in |
| development, drafts of this standard version were referred to as |
| @dfn{C9X}.) GCC has substantially |
| complete support for this standard version; see |
| @uref{http://gcc.gnu.org/c99status.html} for details. To select this |
| standard, use @option{-std=c99} or @option{-std=iso9899:1999}. |
| |
| Errors in the 1999 ISO C standard were corrected in three Technical |
| Corrigenda published in 2001, 2004 and 2007. GCC does not support the |
| uncorrected version. |
| |
| A fourth version of the C standard, known as @dfn{C11}, was published |
| in 2011 as ISO/IEC 9899:2011. (While in development, drafts of this |
| standard version were referred to as @dfn{C1X}.) |
| GCC has substantially complete support |
| for this standard, enabled with @option{-std=c11} or |
| @option{-std=iso9899:2011}. A version with corrections integrated was |
| prepared in 2017 and published in 2018 as ISO/IEC 9899:2018; it is |
| known as @dfn{C17} and is supported with @option{-std=c17} or |
| @option{-std=iso9899:2017}; the corrections are also applied with |
| @option{-std=c11}, and the only difference between the options is the |
| value of @code{__STDC_VERSION__}. |
| |
| A further version of the C standard, known as @dfn{C2X}, is under |
| development; experimental and incomplete support for this is enabled |
| with @option{-std=c2x}. |
| |
| By default, GCC provides some extensions to the C language that, on |
| rare occasions conflict with the C standard. @xref{C |
| Extensions,,Extensions to the C Language Family}. |
| Some 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. |
| Use of the |
| @option{-std} options listed above disables these extensions where |
| they conflict with the C standard version selected. You may also |
| select an extended version of the C language explicitly with |
| @option{-std=gnu90} (for C90 with GNU extensions), @option{-std=gnu99} |
| (for C99 with GNU extensions) or @option{-std=gnu11} (for C11 with GNU |
| extensions). |
| |
| The default, if no C language dialect options are given, |
| is @option{-std=gnu17}. |
| |
| The ISO C standard defines (in clause 4) two classes of conforming |
| implementation. A @dfn{conforming hosted implementation} supports the |
| whole standard including all the library facilities; a @dfn{conforming |
| freestanding implementation} is only required to provide certain |
| library facilities: those in @code{<float.h>}, @code{<limits.h>}, |
| @code{<stdarg.h>}, and @code{<stddef.h>}; since AMD1, also those in |
| @code{<iso646.h>}; since C99, also those in @code{<stdbool.h>} and |
| @code{<stdint.h>}; and since C11, also those in @code{<stdalign.h>} |
| and @code{<stdnoreturn.h>}. In addition, complex types, added in C99, are not |
| required for freestanding implementations. |
| |
| The standard also defines two environments for programs, a |
| @dfn{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 @dfn{hosted |
| environment}, which is not required, in which all the library |
| facilities are provided and startup is through a function @code{int |
| main (void)} or @code{int main (int, char *[])}. An OS kernel is an example |
| of a program running in a freestanding environment; |
| a program using the facilities of an |
| operating system is an example of a program running in a hosted environment. |
| |
| @opindex ffreestanding |
| GCC aims towards being usable as a conforming freestanding |
| implementation, or as the compiler for a conforming hosted |
| implementation. By default, it acts as the compiler for a hosted |
| implementation, defining @code{__STDC_HOSTED__} as @code{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 @option{-ffreestanding}; it then defines |
| @code{__STDC_HOSTED__} to @code{0} and does 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. |
| @xref{C Dialect Options,,Options Controlling C Dialect}. |
| |
| GCC does not provide the library facilities required only of hosted |
| implementations, nor yet all the facilities required by C99 of |
| freestanding implementations on all platforms. |
| To use the facilities of a hosted |
| environment, you need to find them elsewhere (for example, in the |
| GNU C library). @xref{Standard Libraries,,Standard Libraries}. |
| |
| Most of the compiler support routines used by GCC are present in |
| @file{libgcc}, but there are a few exceptions. GCC requires the |
| freestanding environment provide @code{memcpy}, @code{memmove}, |
| @code{memset} and @code{memcmp}. |
| Finally, if @code{__builtin_trap} is used, and the target does |
| not implement the @code{trap} pattern, then GCC emits a call |
| to @code{abort}. |
| |
| For references to Technical Corrigenda, Rationale documents and |
| information concerning the history of C that is available online, see |
| @uref{http://gcc.gnu.org/readings.html} |
| |
| @section C++ Language |
| |
| GCC supports the original ISO C++ standard published in 1998, |
| and the 2011, 2014, 2017 and mostly 2020 revisions. |
| |
| 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 (@code{export} |
| is a notable exception) and most of the changes in C++03. To select |
| this standard in GCC, use one of the options @option{-ansi}, |
| @option{-std=c++98}, or @option{-std=c++03}; to obtain all the diagnostics |
| required by the standard, you should also specify @option{-pedantic} (or |
| @option{-pedantic-errors} if you want them to be errors rather than |
| warnings). |
| |
| A revised ISO C++ standard was published in 2011 as ISO/IEC |
| 14882:2011, and is referred to as C++11; before its publication it was |
| commonly referred to as C++0x. C++11 contains several changes to the |
| C++ language, all of which have been implemented in GCC@. For details |
| see @uref{https://gcc.gnu.org/projects/@/cxx-status.html#cxx11}. |
| To select this standard in GCC, use the option @option{-std=c++11}. |
| |
| Another revised ISO C++ standard was published in 2014 as ISO/IEC |
| 14882:2014, and is referred to as C++14; before its publication it was |
| sometimes referred to as C++1y. C++14 contains several further |
| changes to the C++ language, all of which have been implemented in GCC@. |
| For details see @uref{https://gcc.gnu.org/projects/@/cxx-status.html#cxx14}. |
| To select this standard in GCC, use the option @option{-std=c++14}. |
| |
| The C++ language was further revised in 2017 and ISO/IEC 14882:2017 was |
| published. This is referred to as C++17, and before publication was |
| often referred to as C++1z. GCC supports all the changes in that |
| specification. For further details see |
| @uref{https://gcc.gnu.org/projects/@/cxx-status.html#cxx17}. Use the option |
| @option{-std=c++17} to select this variant of C++. |
| |
| Another revised ISO C++ standard was published in 2020 as ISO/IEC |
| 14882:2020, and is referred to as C++20; before its publication it was |
| sometimes referred to as C++2a. GCC supports most of the changes in the |
| new specification. For further details see |
| @uref{https://gcc.gnu.org/projects/@/cxx-status.html#cxx20}. |
| To select this standard in GCC, use the option @option{-std=c++20}. |
| |
| More information about the C++ standards is available on the ISO C++ |
| committee's web site at @uref{http://www.open-std.org/@/jtc1/@/sc22/@/wg21/}. |
| |
| To obtain all the diagnostics required by any of the standard versions |
| described above you should specify @option{-pedantic} |
| or @option{-pedantic-errors}, otherwise GCC will allow some non-ISO C++ |
| features as extensions. @xref{Warning Options}. |
| |
| By default, GCC also provides some additional extensions to the C++ language |
| that on rare occasions conflict with the C++ standard. @xref{C++ |
| Dialect Options,Options Controlling C++ Dialect}. Use of the |
| @option{-std} options listed above disables these extensions where they |
| they conflict with the C++ standard version selected. You may also |
| select an extended version of the C++ language explicitly with |
| @option{-std=gnu++98} (for C++98 with GNU extensions), or |
| @option{-std=gnu++11} (for C++11 with GNU extensions), or |
| @option{-std=gnu++14} (for C++14 with GNU extensions), or |
| @option{-std=gnu++17} (for C++17 with GNU extensions), or |
| @option{-std=gnu++20} (for C++20 with GNU extensions). |
| |
| The default, if |
| no C++ language dialect options are given, is @option{-std=gnu++17}. |
| |
| @section Objective-C and Objective-C++ Languages |
| @cindex Objective-C |
| @cindex Objective-C++ |
| |
| GCC supports ``traditional'' Objective-C (also known as ``Objective-C |
| 1.0'') and contains support for the Objective-C exception and |
| synchronization syntax. It has also support for a number of |
| ``Objective-C 2.0'' language extensions, including properties, fast |
| enumeration (only for Objective-C), method attributes and the |
| @@optional and @@required keywords in protocols. GCC supports |
| Objective-C++ and features available in Objective-C are also available |
| in Objective-C++@. |
| |
| GCC by default uses the GNU Objective-C runtime library, which is part |
| of GCC and is not the same as the Apple/NeXT Objective-C runtime |
| library used on Apple systems. There are a number of differences |
| documented in this manual. The options @option{-fgnu-runtime} and |
| @option{-fnext-runtime} allow you to switch between producing output |
| that works with the GNU Objective-C runtime library and output that |
| works with the Apple/NeXT Objective-C runtime library. |
| |
| There is no formal written standard for Objective-C or Objective-C++@. |
| The authoritative manual on traditional Objective-C (1.0) is |
| ``Object-Oriented Programming and the Objective-C Language'': |
| @uref{http://www.gnustep.org/@/resources/@/documentation/@/ObjectivCBook.pdf} |
| is the original NeXTstep document. |
| |
| The Objective-C exception and synchronization syntax (that is, the |
| keywords @code{@@try}, @code{@@throw}, @code{@@catch}, |
| @code{@@finally} and @code{@@synchronized}) is |
| supported by GCC and is enabled with the option |
| @option{-fobjc-exceptions}. The syntax is briefly documented in this |
| manual and in the Objective-C 2.0 manuals from Apple. |
| |
| The Objective-C 2.0 language extensions and features are automatically |
| enabled; they include properties (via the @code{@@property}, |
| @code{@@synthesize} and |
| @code{@@dynamic keywords}), fast enumeration (not available in |
| Objective-C++), attributes for methods (such as @code{deprecated}, |
| @code{noreturn}, @code{sentinel}, @code{format}), |
| the @code{unused} attribute for method arguments, the |
| @code{@@package} keyword for instance variables and the @code{@@optional} and |
| @code{@@required} keywords in protocols. You can disable all these |
| Objective-C 2.0 language extensions with the option |
| @option{-fobjc-std=objc1}, which causes the compiler to recognize the |
| same Objective-C language syntax recognized by GCC 4.0, and to produce |
| an error if one of the new features is used. |
| |
| GCC has currently no support for non-fragile instance variables. |
| |
| The authoritative manual on Objective-C 2.0 is available from Apple: |
| @itemize |
| @item |
| @uref{https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html} |
| @end itemize |
| |
| For more information concerning the history of Objective-C that is |
| available online, see @uref{http://gcc.gnu.org/readings.html} |
| |
| @section Go Language |
| |
| As of the GCC 4.7.1 release, GCC supports the Go 1 language standard, |
| described at @uref{https://golang.org/doc/go1}. |
| |
| @section D language |
| |
| GCC supports the D 2.0 programming language. The D language itself is |
| currently defined by its reference implementation and supporting language |
| specification, described at @uref{https://dlang.org/spec/spec.html}. |
| |
| @section References for Other Languages |
| |
| @xref{Top, GNAT Reference Manual, About This Guide, gnat_rm, |
| GNAT Reference Manual}, for information on standard |
| conformance and compatibility of the Ada compiler. |
| |
| @xref{Standards,,Standards, gfortran, The GNU Fortran Compiler}, for details |
| of standards supported by GNU Fortran. |