Як із величезної кількості різних версій 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)"
, який є найновішим стабільним стандартом, який підтримує Visual Studio.
Якщо ви хочете поекспериментувати з можливостями майбутнього стандарту мови 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 повинна виконатися без будь-яких попереджень чи помилок:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <array> #include <iostream> #include <string_view> #include <tuple> #include <type_traits> 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 << '\n'; std::array arr{ 1, 2, 3 }; std::cout << std::size(arr) << '\n'; return 0; } |
Якщо вам не вдалося скомпілювати цей код, то або ви не підключили C++17, або ваш компілятор не повністю підтримує C++17. В останньому випадку просто оновіть версію вашої IDE/компілятора.