Атрибуты в c ++ и их использование - PullRequest
0 голосов
/ 12 июля 2020

Самая последняя функция C ++ (которая также довольно современная), о которой я узнал, - это атрибуты. Они кажутся весьма полезными для сигнализации компилятору, но помимо этого, какие еще более специфические c использования могут иметь атрибуты? Как можно создавать и использовать настраиваемые атрибуты и какова основная идея использования атрибутов c ++? Если topi c слишком широк, меня особенно интересуют атрибуты с функциями. Под атрибутами я подразумеваю следующее: https://en.cppreference.com/w/cpp/language/attributes

1 Ответ

3 голосов
/ 12 июля 2020

Атрибуты (то есть атрибуты как особенность языка C ++, а не атрибуты c __declspec или __attribute__, специфичные для компилятора) являются своего рода взломом C ++. Это решение мета-проблем, связанных с эволюцией языка C ++.

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

Но атрибуты дешевы; они не конфликтуют с существующим кодом. Подумайте о том, чтобы объявить, что функция не возвращает нормально (ie: всегда выдает исключение или вызывает std::terminate или что-то еще). Эта функция на самом деле не управляет поведением программы; это скорее индикатор для компилятора / пользователя о том, как эта функция будет себя вести. Так что не стоит нарушать код того, кто случайно назвал переменную noreturn.

Но у вас может быть атрибут [[noreturn]], так как это не нарушит чей-либо код.

Другое решение атрибутов мета-проблемы - это «исправление» вещей, которые, возможно, изначально не были хорошими идеями. Например, метки case в операторах switch автоматически переходят к следующему, если вы явно не указали break. Хотя проваленное поведение полезно, это неправильное поведение как по умолчанию , поскольку в 90 +% случаев вы намереваетесь break.

Но вы не можете go и измените способ работы case меток и введите ключевое слово fallthrough. Это сломало бы любой код, который уже использует неявное поведение падения.

Но вы можете добавить атрибут [[fallthrough]]. Это ничего не значит в языке, но если компилятор это видит, он может знать, что вы хотели перейти к следующей метке. Кроме того, теперь вы можете включить предупреждения компилятора о провале, чтобы любой провал, который происходит без атрибута [[fallthrough]], выдавал вам предупреждение. И вы даже можете сделать это предупреждение ошибкой, эффективно «исправляя» язык. Для вас.

Большинство атрибутов C ++ похожи на это: теги для кода, которые слишком тривиальны / нефункциональны, чтобы беспокоиться о записи ключевого слова, или указывают компилятору что-то полезное в коде, которое на самом деле не является частью языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...