Search

0.12 — Configuring your compiler: Choosing a language standard

With many different versions of C++ available (C++98, C++03, C++11, C++14, C++17, etc…) how does your compiler know which one to use? Generally, a compiler will pick a standard to default to (often not the most recent language standard). If you wish to use a different standard, you’ll have to configure your IDE/compiler to do so. These settings are applied to the active project only. You need to set them again when you create a new project.

Learncpp uses C++17. If your compiler isn’t capable of C++17, you won’t be able to follow all lessons, though the majority is unaffected. Make sure you’re using an up-to-date compiler so you can compile all the examples yourself. There’s an example at the end of this lesson which you can use to test if you set up your compiler correctly.

Code names for in-progress language standards

Note that the language standards are named after the years in which they are finalized (e.g. C++17 was finalized in 2017).

However, when a new language standard is being agreed upon, it’s not clear in what year the finalization will take place. Consequently, in-progress language standards are given code names, which are then replaced by the actual names upon finalization of the standard. For example, C++11 was called c++1x while it was being worked on. You may still see the code names used in places (especially for upcoming version of the language standard, which won’t have a final name yet).

Here’s a mapping of code names to the final names:

  • c++1x = C++11
  • c++1y = C++14
  • c++1z = C++17
  • c++2a = C++20

For example, if you see c++1z, this is synonymous with the C++17 language standard.

Setting a language standard in Visual Studio

As of the time of writing, Visual Studio 2019 defaults to C++14 capabilities, which does not allow for the use of newer features introduced in C++17 (and C++20), some of which are covered in future lessons.

To use these newer features, you’ll need to enable a newer language standard. Unfortunately, there is currently no way to do this globally -- you must do so on a project-by-project basis.

To do so, open your project, then go to Project menu > (Your application’s Name) Properties, then open Configuration Properties > C/C++ > Language.

From there, you can set the C++ Language Standard to the version of C++ you wish to use.

As of the time of writing, we recommend selecting “ISO C++17 Standard (/std:c++17)”, which is the latest stable standard.

If you want to experiment with capabilities from the upcoming C++20 language standard, choose “ISO C++ Latest (/std:c++latest)” instead. Just note that support may be spotty or buggy.

Setting a language standard in Code::Blocks

Code::Blocks may default to a pre-C++11 language standard. You’ll definitely want to check and ensure a more modern language standard is enabled.

The good news is that Code::Blocks allows setting your language standard globally, so you can set it once (rather than per-project). To do so, go to Settings menu > Compiler:

Code::Blocks Settings > Compiler

Then find the box or boxes labeled Have g++ follow the C++XX ISO C++ language standard [-std=c++XX], where XX is 11, 14, or some other higher number (see the items inside the red box below for examples):

Code::Blocks C++11 setting

Check the one with the highest number (in the above image, that’s the C++14 option inside the red box).

Your version of Code::Blocks may also have support for upcoming (or just released) versions of C++. If so, these will be labeled Have g++ follow the coming C++XX (aka C++YY) ISO C++ language standard [-std=c++XX] (see the blue box above). You can optionally check these if you would like to enable features added in that version, but note that support may be incomplete (ie. some features may be missing).

See the list at the top of the lesson for a list of codenames to language standards mappings.

For example, if you want to enable C++17 capabilities and your settings doesn’t have a C++17 option, look for -std=c++1z (the code name for C++17).

Alternatively, you can go to the Other Compiler Options tab and type in -std=c++17.

Code::Blocks Other Compiler Options

Note

This will work if your compiler has C++17 support. If you’re using an older version of Code::Blocks and C++17 features don’t seem to work, upgrade your compiler.

Setting a language standard in g++

For GCC/G++ users

For GCC/G++, you can pass compiler flags -std=c++11, -std=c++14, -std=c++17, or -std=c++2a to enable C++11/14/17/2a support respectively.

Testing your compiler

After you enabled C++17 or higher, you should be able to compile the following code without any warnings or errors.

If you can’t compile this code, you either didn’t enable C++17, or your compiler doesn’t fully support C++17. In the latter case, please install the latest version of your IDE/compiler, as described in lesson 0.6 -- Installing an Integrated Development Environment (IDE).


1.1 -- Statements and the structure of a program
Index
0.11 -- Configuring your compiler: Warning and error levels

81 comments to 0.12 — Configuring your compiler: Choosing a language standard

  • evolve

    Is there any way to install c++17 in Visual studio code? I am using macos.

  • Maurizio

    I use now Code::Block 20.03 under Linuxmint 19.3.
    There are for every C++ version two choices in the compiler settings: GNU or ISO
    Somebody knows the difference between using -std=gnu++17 or -std=c++17 ?
    The tests were successful with both parameters but the output file is a bit smaller using -std=c++17. Googling was not really a help.

    • nascardriver

      gnu++ enables language extensions. Language extension are evil.

      • Maurizio

        Thanks a lot. I googled about what language extentions are and why it's evil. That convinced me.

      • Maurizio

        With Language extentions do you mean QT or GTK+ as well?

        • nascardriver

          QT and GTK+ are libraries, not extensions. Language extensions change the language itself, something that can't be done without modifying the compiler. For example

          would create a temporary array. This looks like it could be C++, but it isn't. It only works if the compiler has an extension for it.

  • DanJ

    I would like to note, that going through tutorials, and having to update the compiler each time to make sure you are on the latest is a bit annoying. For anyone wanting to make this process easier in VS2019, I recommend you set up a template.

    You can see how to do that here: https://docs.microsoft.com/en-us/visualstudio/ide/how-to-create-project-templates?view=vs-2019

    Simply set the settings you want, export it as a template, then whenever you start a new project you can use that as the template. Don't worry, it still asks you to create a new project like normal, it just uses that templates settings! As you get more advanced, you can update that template to cater to your needs.

  • David B

    Hey, I'm using codeblocks and I'm pretty sure I've done everything I'm supposed to. But the test code will not compile

    This line gives the error: 3    fatal error: string_view: No such file or directory.

    I reinstalled the latest version of codeblocks. (The one recommended in a previous lesson) But I still have this issue.

    Is there anything I can do? :/

    • David B

      Anyone know what I can do?

    • nascardriver

      Your compiler is too old. In this table, you can see which version of your compiler you need at least. Codeblocks 20 should come with a compatible compiler.

      • David B

        My codeblocks version is 20.03 (I updated to at least what I think is the latest when it didn't work the first time.)
        Which is why i'm sort of confused. Is there a newer version somewhere else?

        • nascardriver

          codeblocks 20.03 is the latest version, but you might have installed an old compiler anyhow. In codeblocks, go to
          settings -> compiler -> toolchain executables
          There you can see which compiler you're using. Get the version of that compiler, eg.

          if you're using clang and the installation directory is /usr

          Then check the table I liked above so see if the compiler is too old, which it probably is. If it is too old, install a newer compiler and select it in codeblocks. If your compiler is not too old, something else is wrong.

          • David B

            I had a look at the toolchain executables tab and realised it was still using the old compiler from my previous codeblocks install. It runs the code fine now. Thank you so much for the help!

  • Niranjan Bala

    Hi!!
    In the code names section, where code names are mapped with the final names, 'c++1x' is mapped with 'c++11'. But the actual code name was supposed to be 'c++0x' there, since it was expected to be published before 2010. Please correct me if I am wrong.

Leave a Comment

Put all code inside code tags: [code]your code here[/code]