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



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

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

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

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

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

Ниже представлено соответствие кодовых обозначений версий языка программирования C++ и их полных наименований:

Для примера, если вы сталкиваетесь с 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++20, то выберите опцию "Предварительная версия ... (/std:c++latest)". Однако помните, что эта версия может содержать ошибки.

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

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

После этого перейдите на вкладку "Флаги компилятора" и обратите внимание на следующие элементы меню:

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

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

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

Для активации возможностей C++11/14/17/20 в GCC/G++ необходимо указать соответствующие ключи компиляции: -std=c++11, -std=c++14, -std=c++17 или -std=c++2a.

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

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

#include

#include

#include

#include

#include

namespace a :: b :: c

{

inline constexpr std :: string_view str { "hello" } ;

}

template < class . . . T >

std :: tuple < std :: size_t , std :: common_type_t < T . . . >> sum ( T . . . args )

{

return { sizeof . . . ( T ) , ( args + . . . ) } ;

}

int main ( )

{

auto [ iNumbers , iSum ] { sum ( 1 , 2 , 3 ) } ;

std :: cout << a :: b :: c :: str << ' ' << iNumbers << ' ' << iSum << '
' ;

std :: array arr { 1 , 2 , 3 } ;

std :: cout << std :: size ( arr ) << '
' ;

return 0 ;

}

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

150   0  

Comments

    Ничего не найдено.