Исходя из дискуссий об использовании атрибутов, специфичных для поставщика в другом вопросе Я задал себе вопрос, ", какие правила мы должны сообщать людям для использования атрибутов, которых нет в спискев стандарте "?
Определены два атрибута: [[ noreturn ]]
и [[ carries_dependencies ]]
.Стандарт оставляет открытым, как компиляторы должны реагировать на неизвестные атрибуты - таким образом, по стандарту они могут остановиться с сообщением об ошибке.Это не то, что, например, GCC , он выдает предупреждение и продолжает.Такое поведение, вероятно, следует ожидать от наиболее распространенных компиляторов.По этой причине я хотел бы прочитать в стандарте «следует», но у нас его нет.
В документе N2553 приведены гибкие атрибуты.В нем перечислены дополнительные атрибуты, используемые GCC (unused
, weak
) и MSVC (dllimport
).для OpenMP, широко поддерживаемой структуры распараллеливания, предлагаются атрибуты области действия, например.omp::for(clause, clause)
, omp::parallel(clause,clause)
.Таким образом, весьма вероятно, что мы определим некоторые атрибуты, относящиеся к конкретным поставщикам, очень скоро после того, как они вообще поддержат синтаксис.
Поэтому, когда мы сейчас пойдем «в мир» и расскажем людям о C ++ 11, какой будет совет по использованию атрибутов?
- Используйте только
noreturn
и carries_dependencies
- Используйте вместо этого ваши компиляторы старый синтаксис , например.
__attribute__((noreturn))
и определение макроса при переносе кода (текущая ситуация) - Используйте эти атрибуты, которые ваш любимый компилятор поддерживает свободно, зная, что этот код может не переноситься на другой компилятор, соответствующий стандарту, потому что если стандартпозволяет остановить компилятор с ошибкой, вы должны учитывать, что это произойдет.Это звучит немного похоже на пропаганду написания непереносимого кода.
- Или, я предполагаю, что наиболее часто используемые компиляторы предупреждают о неизвестных атрибутах, поэтому вы можете использовать атрибуты, специфичные для поставщика,помните, что в редких случаях у вас могут возникнуть проблемы.
Обратите внимание на небольшую разницу в двух последних пунктах.В то время как оба говорят «используйте те атрибуты, которые вам нужны», сообщение item3 «не заботится о других компиляторах», в то время как item4 неявно перефразирует стандартные тексты «поведение, определяемое реализацией», в «компилятор должен выдавать диагностическое сообщение»".
Что может быть предложено для предстоящей Best Practice здесь?