Поддерживает ли MSV C атрибуты в стиле C ++ 11 вместо __declspe c? - PullRequest
2 голосов
/ 11 июля 2020

Я знаю, что атрибуты в стиле C ++ 11 поддерживают определенные производителем c атрибуты, которым предшествует пространство имен. И G CC, и Clang поддерживают различные атрибуты с префиксом gnu:: (g cc и clang) или clang:: (только clang), что соответствует эквивалентному синтаксису __attribute__((...)).

Документация для MSV C атрибутов показывает, что он поддерживает стандартные атрибуты, а также атрибут gsl::, но не упоминает об обратной совместимости для __declspec атрибутов.

Я бы ожидал, что что-то вроде __declspec(noinline) будет иметь атрибутное представление [[msvc::noinline]], но я не могу найти никакой документации по этому поводу.

Итак, мой вопрос, есть ли MSV C поддерживать __declspec как атрибуты стиля C ++ 11?

Если нет, может ли кто-нибудь знать, что они этого не делают? Исходное обоснование атрибутов C ++ заключалось в том, чтобы абстрагироваться от различных специфичных для компилятора c __attribute__ и __declspec функций, поэтому было бы странно, если бы он по-прежнему не поддерживался через 9 лет после стандартизации.

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

В VC ++ 2019 не существует [[msvc::noinline]] или других __declspec эквивалентов.

Из официальной документации MSV C для атрибутов в C ++ :

В Visual C ++ вы можете использовать атрибут [[deprecated]] вместо declspec(deprecated), и этот атрибут будет распознан любым совместимым компилятором. Для всех остальных declspec таких параметров, как dllimport и dllexport, эквивалента атрибутов пока нет, поэтому вы должны продолжать использовать синтаксис declspec.


[ РЕДАКТИРОВАТЬ ] Информации о , почему [[attributes]] не более широко используются в VC ++, возможно, полностью заменяя __declspec, на удивление мало. Наиболее близкими к авторитетному источнику, который я нашел, были эти комментарии в потоке Reddit последовательность спецификатора атрибута C ++, MSV C и меня :

spongo2 - MSV C Dev Менеджер

У нас только что состоялось оживленное обсуждение этого топи c в командной комнате. Мы определенно видим здесь пример использования, и он интересен, но нам интересно, будет ли тот факт, что количество мест, в которые можно помещать атрибуты, большое и увеличивающееся, приведет к неожиданному поведению. 1044 * STL - MSV C STL Dev

Я бы использовал [[msv c :: kitty]] вместо __declspe c (kitty) в STL, чтобы наши источники более удобны для других интерфейсов. Я уже переключился на использование [[noreturn]] вместо __declspe c (noreturn), потому что это Стандарт.

Я считаю, что более широкое распространение сдерживает беспокойство о области действия атрибутов по сравнению с __declspe c и обратная совместимость в целом.

0 голосов
/ 11 июля 2020

Согласно Атрибуты в C ++ единственный __declspe c () с заменой атрибута - [[устаревший]], для всех остальных модификаторов __declspe c () вы должны продолжать использовать __declspe c.

...