Which C++ standard is the default when compiling with g++?

Solution 1:

If your version of g++ is later than 4.7 I think you can find the default version of C++ standard supported like so:

g++ -dM -E -x c++  /dev/null | grep -F __cplusplus

An example from my machine:

mburr@mint17 ~ $ g++ --version | head -1
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
mburr@mint17 ~ $ g++ -dM -E -x c++  /dev/null | grep -F __cplusplus
#define __cplusplus 199711L

Some references:

  • Details on the g++ options used
  • Why this only works for g++ 4.7 or later

Solution 2:

You can also check with gdb

  1. $ g++ example.cpp -g Compile program with -g flag to generate debug info
  2. $ gdb a.out Debug program with gdb
  3. (gdb) b main Put a breakpoint at main
  4. (gdb) run Run program (will pause at breakpoint)
  5. (gdb) info source

Prints out something like:

Current source file is example.cpp
Compilation directory is /home/xxx/cpp
Located in /home/xxx/cpp/example.cpp
Contains 7 lines.
Source language is c++.
Producer is GNU C++14 6.3.0 20170516 -mtune=generic -march=x86-64 -g.
Compiled with DWARF 2 debugging format.
Does not include preprocessor macro info.

There is the standard used by compiler: Producer is GNU C++14

If you recompile your program using -std=c++11 (for example), gdb detects it: Producer is GNU C++11

Solution 3:

I believe that it is possible to tell by looking at the man page (at least for g++):

Under the description of -std, the man page lists all C++ standards, including the GNU dialects. Under one specific standard, it is rather inconspicuously stated, This is the default for C++ code. (there is an analogous statement for C standards: This is the default for C code.).

For instance, for g++/gcc version 5.4.0, this is listed under gnu++98/gnu++03, whereas for g++/gcc version 6.4.0, this is listed under gnu++14.

Solution 4:

g++ man page actually tells what is the default standard for C++ code.

Use following script to show the relevant part:

man g++ | col -b | grep -B 1 -e '-std.* default'

For example, in RHEL 6 g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23), the output:

         gnu++98
           GNU dialect of -std=c++98.  This is the default for C++ code.

And in Fedora 28 g++ (GCC) 8.1.1 20180502 (Red Hat 8.1.1-1), the output:

       gnu++1y
           GNU dialect of -std=c++14.  This is the default for C++ code.  The name gnu++1y is deprecated.

Solution 5:

I'm guessing a default version of the C++ compiler gets called, but I don't know which?

This is only guessable by reading the documentation of your particular compiler version.

If using a recent GCC, I recommend first to understand what version are you using by running

g++ -v

or

g++ --version

and then refer to the version of the particular release of GCC. For example for GCC 7, read GCC 7 changes etc

Alternatively, run

g++ -dumpspecs

and decipher the default so called spec file.

BTW, you could ensure (e.g. in some of your common header file) that C++ is at least C++17 by coding

 #if __cplusplus < 201412L
 #error expecting C++17 standard
 #endif

and I actually recommend doing it that way.

PS. Actually, think of C++98 & C++17 being two different languages (e.g. like Ocaml4 and C++11 are). Require your user to have a compiler supporting some defined language standard (e.g. C++11), not some particular version of GCC. Read also about package managers.