Предложения по использованию атрибутов за пределами [[noreturn]]? - PullRequest
4 голосов
/ 16 сентября 2011

Исходя из дискуссий об использовании атрибутов, специфичных для поставщика в другом вопросе Я задал себе вопрос, ", какие правила мы должны сообщать людям для использования атрибутов, которых нет в спискев стандарте "?

Определены два атрибута: [[ 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 здесь?

1 Ответ

1 голос
/ 17 сентября 2011

Лучшая практика - единственная, которая является достаточно переносимой в практическом плане, не говоря уже о двусмысленности в Стандарте, - это использование макросов.Пройдет много лет, прежде чем мы сможем забыть о компиляторах, которые не поддерживают атрибуты.

Количество компиляторов и число пользовательских __keywords__, определенных этими компиляторами, всегда будет увеличиваться, и это имеет смысл дляязык, чтобы определить способ сдержать ущерб.Это не должно революционизировать способ, которым люди пишут непереносимый код, или делать непереносимый код переносимым (хотя стандартные атрибуты делают это).Преимущество заключается в том, чтобы дать разработчикам бэкэнда компилятора с добавлением кофеина изолированную среду, когда они хотят расширить грамматику.

Однако немного тревожно, что токены атрибутов не зарезервированы для реализации илиязык, кроме тех, которые в настоящее время стандартны.Так что будут проблемы, когда они решат стандартизировать больше из них.

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