Россия и Беларусь начали и продолжают войну против народа Украины!

Конфигурация компилятора: Выбор стандарта языка С++

  Юрий  | 

  |

  Обновл. 15 Сен 2021  | 

 38834

 ǀ   9 

Как с огромным количеством различных версий языка C++ (C++98, C++03, C++11, C++14, C++17, C++20) компилятор понимает, какую из них ему следует использовать? Как правило, компилятор выбирает стандарт языка по умолчанию (часто не самый последний языковой стандарт). Если вы хотите использовать другой стандарт, то вам придется внести изменения в настройки вашей IDE/компилятора. Эти настройки применяются только к текущему проекту. При создании нового проекта вам придется всё делать заново.

Кодовые имена для версий языка С++

Обратите внимание на то, что каждый языковый стандарт имеет название, указывающее на год его принятия/утверждения (например, C++17 был принят/утвержден в 2017 году).

Однако, когда согласовывается новый языковой стандарт, неясно, в каком году удастся его принять, поэтому действующим языковым стандартам присваиваются кодовые имена, которые затем заменяются фактическими именами при доработке стандарта. Например, C++11 назывался c++1x, пока над ним вели работу. Вы можете по-прежнему видеть на просторах Интернета подобные кодовые имена (особенно, когда речь заходит о будущей версии языкового стандарта, у которого еще нет окончательного названия).

Вот сопоставление кодовых имен версий С++ с их окончательными названиями:

   c++1x = C++11

   c++1y = C++14

   c++1z = C++17

   c++2a = C++20

Например, если вы видите c++1z, то знайте, что речь идет о стандарте C++17.

Установка стандарта языка С++ в Visual Studio


На момент написания данной статьи, Visual Studio 2019 по умолчанию использует возможности C++14, что не позволяет использовать более новые фичи, представленные в C++17 и в C++20.

Чтобы использовать новый функционал, вам необходимо подключить новый языковой стандарт. К сожалению, сейчас нет способа сделать это глобально — вы должны делать это к каждому проекту индивидуально.

Чтобы использовать новый языковый стандарт в Visual Studio, откройте ваш проект, затем щелкните правой кнопкой мышки по названию вашего проекта в меню "Обозреватель решений" > "Свойства":

В диалоговом окне вашего проекта убедитесь, что в пункте "Конфигурация" установлено значение "Все конфигурации". Затем перейдите на вкладку "C/C++" > "Язык" и в пункте "Стандарт языка С++" выберите ту версию языка С++, которую хотели бы использовать:

На момент написания данной статьи, я рекомендую выбрать "Стандарт ISO C++17 (/std:c++17)", который является последним стабильным стандартом.

Если вы хотите поэкспериментировать с возможностями грядущего стандарта языка C++ — C++20, то вы можете выбрать пункт "Предварительная версия ... (/std:c++latest)". Просто помните, что его поддержка может иметь баги.

Установка стандарта языка C++ в Code::Blocks

Code::Blocks по умолчанию может использовать стандарт C++11. Хорошей новостью является то, что Code::Blocks позволяет устанавливать ваш стандарт языка С++ глобально, поэтому вы можете установить его один раз и сразу на все проекты (а не для каждого проекта в индивидуальном порядке). Для этого перейдите в меню "Settings" > "Compiler":

Затем на вкладке "Compiler flags" найдите следующие пункты меню:

Отметьте тот пункт, у которого число обозначает ближайший (к текущему) год утверждения стабильной версии и нажмите "ОК" (на вышеприведенном скриншоте этим пунктом является "Have g++ follow the C++17 ISO C++ language standard [-std=c++17]").

Примечание: Если вы не нашли в ваших настройках опцию с C++17, то вам следует обновить вашу версию Code::Blocks.

Установка стандарта языка С++ в GCC/G++


В GCC/G++ вы можете прописать соответствующие флаги -std=c++11, -std=c++14, -std=c++17 или -std=c++2a, чтобы подключить функционал C++11/14/17/20, соответственно.

Тестирование вашего компилятора

После подключения версии C++17 или выше, вы можете провести тест, который позволит понять, всё ли верно сделано и действительно ли подключена новая версия языка С++. Следующая программа в С++17 должна выполниться без каких-либо предупреждений или ошибок:

Если вы не можете скомпилировать этот код, то либо вы не подключили C++17, либо ваш компилятор не полностью поддерживает C++17. В последнем случае обновите версию IDE или компилятора.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (199 оценок, среднее: 4,93 из 5)
Загрузка...

Комментариев: 9

  1. dovlet:

    Здравствуйте огромное спасибо вам за уроки.

    1. Avatar photo Юрий:

      Пожалуйста)

  2. Rammsnia:

    Здравствуйте, у меня выдавало ошибку "No such file or directory" Ничего не помогало, переустанавливал много раз разные версии с оф. сайта и Компилятор отдельно тоже устанавливал, но помогло только то, что я из Other compiler options убрал -Wsign-conversion –Werror. Скажите, это как-то повлияет на дальнейшую работу?

    1. zzz:

      Проблема кроется в черточке (–) перед Werror. Вы, вероятно, как и я просто скопировали текст из предыдущего урока:
      -Wsign-conversion –Werror
      Надо удалить черточку и написать минус (-). Должно получиться вот так:
      -Wsign-conversion -Werror
      И всё заработает.

      1. Felix:

        Да, действительно, Вы правы. Скопировал у Вас и вставил. Компилирует в Code::Blocks без ошибки.

  3. Ronnie:

    в codeblocks данный вами для проверки (подключился ли C++17) код не работает, выдает 2 ошибки —
    No such file or directory
    error: no input files

    1. Avatar photo Юрий:

      Только что всё проверил у себя — работает. Может вы не подключили С++17 или подключили но не то. В качестве решения могу предложить скачать последнюю версию Code::Blocks с оф. сайта и внимательно проделать то, что указано в статье ещё раз)

      1. Ronnie:

        Переустановила (оба раза скачивала тотже файл с оф. стр. C::B), с С++17 работает, проверила ради интереса с [-std=C++20], выдает ошибку : unrecognized command line option '-std=C++20', did you mean '-std=c++2a'

        1. Avatar photo Юрий:

          Проблема в использовании ‘-std=C++20’, в статье поправил это, спасибо.

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *