123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- @c Copyright (C) 2000-2015 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 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__
- GCC supports three versions of the C standard, although support for
- the most recent version is not yet complete.
- @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.
- This standard, in both its forms, is commonly known as @dfn{C89}, or
- occasionally as @dfn{C90}, from the dates of ratification. The ANSI
- standard, but not the ISO standard, also came with a Rationale
- document. 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}. 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}. (While in
- development, drafts of this standard version were referred to as
- @dfn{C9X}.)
- 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. GCC has substantially complete support
- for this standard, enabled with @option{-std=c11} or
- @option{-std=iso9899:2011}. (While in development, drafts of this
- standard version were referred to as @dfn{C1X}.)
- 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}. Use of the
- @option{-std} options listed above will disable 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=gnu11}. 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.
- 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 would be a freestanding environment; a
- program using the facilities of an operating system would normally be
- in a hosted implementation.
- @opindex ffreestanding
- 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 @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 will then define
- @code{__STDC_HOSTED__} to @code{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.
- @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 will 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 will emit 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 (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 (@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, most of which have been implemented in an
- experimental C++11 mode in GCC@. For information
- regarding the C++11 features available in the experimental C++11 mode,
- see @uref{http://gcc.gnu.org/projects/@/cxx0x.html}. To select this
- standard in GCC, use the option @option{-std=c++11}; 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).
- 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/}.
- By default, GCC provides some extensions to the C++ language; @xref{C++
- Dialect Options,Options Controlling C++ Dialect}. Use of the
- @option{-std} option listed above will disable these extensions. 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). The default, if
- no C++ language dialect options are given, is @option{-std=gnu++98}.
- @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'',
- available at a number of web sites:
- @itemize
- @item
- @uref{http://www.gnustep.org/@/resources/@/documentation/@/ObjectivCBook.pdf}
- is the original NeXTstep document;
- @item
- @uref{http://objc.toodarkpark.net}
- is the same document in another format;
- @item
- @uref{http://developer.apple.com/@/mac/@/library/@/documentation/@/Cocoa/@/Conceptual/@/ObjectiveC/}
- has an updated version but make sure you search for ``Object Oriented Programming and the Objective-C Programming Language 1.0'',
- not documentation on the newer ``Objective-C 2.0'' language
- @end itemize
- The Objective-C exception and synchronization syntax (that is, the
- keywords @@try, @@throw, @@catch, @@finally and @@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 @@property, @@synthesize and
- @@dynamic keywords), fast enumeration (not available in
- Objective-C++), attributes for methods (such as deprecated, noreturn,
- sentinel, format), the unused attribute for method arguments, the
- @@package keyword for instance variables and the @@optional and
- @@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{http://developer.apple.com/@/mac/@/library/@/documentation/@/Cocoa/@/Conceptual/@/ObjectiveC/}
- @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{http://golang.org/doc/go1.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.
- @xref{Compatibility,,Compatibility with the Java Platform, gcj, GNU gcj},
- for details of compatibility between @command{gcj} and the Java Platform.
|