cubuntugccc99c11

What is the default C -std standard version for the current GCC (especially on Ubuntu)?


When I ask to see the current version of cc I get this.

$ cc --version
cc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ 

What I would like to know is which of c89, c90, c99 or c11 is being used.


Solution

  • This is explained in depth in the gcc manual, available (if it's installed) by typing info gcc or online here. The relevant section of the current manual is here, but it may or may not correspond to the version you're using.

    Some of this information has changed since I posted this answer in 2013, and will continue to change. If you're reading this around 2023, the current version is probably -std=gnu17 (C17 with GNU-specific extensions; C17 is a minor update to C11). You should check the documentation for the version you're using. The C23 standard has not yet been released, but should be out Real Soon Now. I can't predict when gcc will switch to -std=gnu23 as its default. If you're reading this in the distant future, let us know how things turned out.

    gcc releases from 3.0 to 4.9.4 default to -std=gnu89 or -std=gnu90.
    gcc releases from 5.5 to 10.4 default to -std=gnu11 (they skipped -std=gnu99, though you can still specify it).
    gcc releases 11.3 and 12.2 default to std=gnu17.


    By default, gcc does not conform to any of the ANSI/ISO C standards. The current default is equivalent to -std=gnu17, which is the 2017 standard with GNU-specific extensions. (Some diagnostics required by the language standard are not issued.) Earlier releases of gcc have defaulted to -std=gnu90 or -std=gnu11.

    If you want standard conformance, you can use any of the following:

    -std=c90 -pedantic
    -std=c99 -pedantic
    -std=c11 -pedantic
    -std=c17 -pedantic
    

    -std=c90 can also be spelled -ansi, -std=c89, or -std=iso9899:1990.

    -std=iso9899:199409 supports the C90 standard plus the 1995 amendment, which added a few minor features (all of which are also in C99).

    -std=c99 can also be spelled -std=c9x or -std=iso9899:1999 (the name c9x was used before the standard was published). C99 support is not quite complete, but it's close.

    -std=c11 can also be spelled -std=c0x or -std=iso9899:2011 (the name c0x was used before the final standard was published; it was wrongly assumed that x would not exceed 9). C11 support is also incomplete; the current status is summarized here.

    The -pedantic option causes gcc to print required diagnostics for violations of constraints and syntax rules. In some cases, those diagnostics are merely warnings -- and there's no easy way to distinguish between those warnings and other warnings that aren't required by the language. Replace -pedantic by -pedantic-errors to cause gcc to treat language violations as fatal errors.

    A quick history of the standard:

    ANSI did not issue its own versions of the 1999 or later standards, adopting the ISO standards instead.

    N1256 is a freely available draft of the C99 standard, with the 3 Technical Corrigenda merged into it.

    N1570 is a freely available draft of the C11 standard. There are some minor differences between it and the published C11 standard, plus one Technical Corrigendum. For more details, see my answer to this question.