Может ли компилятор сообщать об ошибках неизвестных атрибутов?Даже с размахом? - PullRequest
6 голосов
/ 14 сентября 2011

В N3291 "7.6.1. (3/5) Синтаксис и семантика атрибутов [decl.attr.grammar]" относительно того, как атрибуты записаны в исходном коде, который я читаю

Использование токена атрибута условно поддерживается с поведением, определяемым реализацией.

и

Для атрибута-токена , не указанного в этом международном стандарте, поведение определяется реализацией.

Означает ли это, что спецификации атрибутов, такие как

[[ dllexport ]]
[[ hiding ]]
[[ unused ]]
[[ vendor::attrib ]]

может жаловаться на стандартный соответствующий компилятор ?Итак, он может сообщить об ошибке и остановить компиляцию?

Я бы надеялся, что компилятор должен игнорировать атрибуты , которые он не знает, как их обрабатывать.Хорошо, это может быть опасно, потому что опечатки в атрибутах могут быть пропущены, например, [[ noretrun ]] или [[ carrys_dependencie ]]: -)

Но особенно здесь помогут пространства имен, верно?Когда я компилирую [[ gcc::mips ]] на компиляторе Microsoft , он должен игнорировать это, а не отклонять его, верно?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

Это может сделать что-нибудь; это то, что означает «определенная реализация».

Цель спецификации атрибута состоит в том, чтобы производители компиляторов перестали загромождать язык специальным синтаксисом и ключевыми словами. Чтобы дать им единую грамматику для определения этих вещей. Это способ связать определенную компилятором строку с конкретным объектом или определением.

В настоящее время почти никто не поддерживает новый синтаксис атрибута. Так что, хотя может делать что-либо, в настоящее время он не ничего .

2 голосов
/ 14 сентября 2011
[[ vendor::attrib ]]

может жаловаться на стандартный соответствующий компилятор?

Да, особенно этот должен жаловаться на стандартный соответствующий компилятор, который не 'не поддерживает условно поддерживаемое поведение (требуется диагностическое сообщение).

Однако я не уверен насчет других.Стандарт также содержит следующее:

... Если атрибут-seq-атрибут, который относится к какой-либо сущности или выражению, содержит атрибут, который нельзя применять к этой сущности или выражению, программаплохо сформирован....

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

В настоящее время gcc принимает неизвестные атрибуты с предупреждением , поэтому я считаю, что это будет работать с новым синтаксисомтоже.

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