Макросы проверки возможностей (начиная с C++20)
Стандарт определяет набор макросов препроцессора, соответствующих языку C++ и возможностям библиотеки, представленным в C++11 или новее. Они предназначены как простой и портабельный способ проверки наличия указанных возможностей.
Атрибуты
__has_cpp_attribute( маркер-атрибута )
|
|||||||||
Проверяет поддержку атрибута с именем маркер-атрибута (после раскрытия макроса).
Для каждого стандартного атрибута реализация определяет, расширяется ли __has_cpp_attribute до значения, указанного в таблице ниже (это год и месяц, в которых атрибут был добавлен в рабочий проект) или 0. Он расширится до заданного значения в таблице тогда и только тогда, когда стандартный атрибут заставляет реализацию вести себя так, как рекомендовано (выдача диагностических сообщений, влияние на структуру классов и т.д.).
Наличие атрибутов, специфичных для поставщика, определяется ненулевым значением.
__has_cpp_attribute можно разложить на выражение
#if и
#elif.
Он рассматривается как определённый макрос для
#ifdef,
#ifndef,
#elifdef,
#elifndef (начиная с C++23) и defined, но не может быть использован где-либо еще.
| маркер-атрибута | Атрибут | Значение | Стандарт | Документ(ы) |
|---|---|---|---|---|
assume
|
[[assume]]
|
202207L
|
(C++23) | P1774R8 |
carries_dependency
|
[[carries_dependency]]
|
200809L
|
(C++11) | N2556, N2643 |
deprecated
|
[[deprecated]]
|
201309L
|
(C++14) | N3760 |
fallthrough
|
[[fallthrough]]
|
201603L
|
(C++17) | P0188R1 |
likely
|
[[likely]]
|
201803L
|
(C++20) | P0479R5 |
maybe_unused
|
[[maybe_unused]]
|
201603L
|
(C++17) | P0212R1 |
no_unique_address
|
[[no_unique_address]]
|
201803L
|
(C++20) | P0840R2 |
nodiscard
|
[[nodiscard]]
|
201603L
|
(C++17) | P0189R1 |
201907L
|
(C++20) | P1301R4 | ||
noreturn
|
[[noreturn]]
|
200809L
|
(C++11) | N2761 |
unlikely
|
[[unlikely]]
|
201803L
|
(C++20) | P0479R5 |
| Общее количество атрибутов: 10 | ||||
Возможности языка
Следующие макросы предопределены в каждой единице трансляции. Каждый макрос расширяется до целочисленного литерала, соответствующего году и месяцу, когда соответствующая возможность была включена в рабочий черновик.
Когда возможность значительно изменится, макрос будет обновлён соответствующим образом.
| Имя макроса | Возможность | Значение | Стд |
|---|---|---|---|
__cpp_aggregate_bases |
Агрегирование классов с базовыми классами | 201603L |
(C++17) |
__cpp_aggregate_nsdmi |
Агрегирование классов с инициализаторами элементов по умолчанию | 201304L |
(C++14) |
__cpp_aggregate_paren_init |
Агрегированная инициализация в форме прямой инициализации | 201902L |
(C++20) |
__cpp_alias_templates |
Шаблоны псевдонимов | 200704L |
(C++11) |
__cpp_aligned_new |
Динамическое выделение памяти для данных с нестандартным выравниванием | 201606L |
(C++17) |
__cpp_attributes |
Атрибуты | 200809L |
(C++11) |
__cpp_binary_literals |
Двоичные литералы | 201304L |
(C++14) |
__cpp_capture_star_this |
Лямбда-захват *this по значению как [=,*this] | 201603L |
(C++17) |
__cpp_char8_t |
char8_t | 201811L |
(C++20) |
__cpp_concepts |