Выравнивание элемента структуры с помощью _Alignas

Меня интересует следующее: является ли новое выравнивание _Alignas спецификатор в C11 применим к элементам структуры?

Я всегда так предполагал, но внимательное изучение N1570 общедоступный проект, по-видимому, указывает на то, что спецификатор выравниванияне может появиться в спецификаторе-квалификаторе-списке, где я и ожидал быть, если бы это было поддержано. Я прочитал грамматику пару раз но не могу понять, как _Alignasдолжно быть разрешено в объявление члена структуры.

Однако мне кажется, что целью стандарта является _Alignasследует применять к элементам конструкции, как в абзаце в _Alignas(§ 6.7.5) говорится, что «атрибут выравнивания не должен быть указано в объявлении [...] битового поля". Учитывая, что термин «битовое поле» определен в § 6.7.2.1 как структура член (точная формулировка: «такой член называется битовым полем»), Я всегда интерпретировал это предложение как неявно означающее выравнивание спецификаторы были разрешены для членов, не являющихся битовыми полями.

Проверка существующих реализаций показывает, что обе версии Clang 3.0 и GCC 4.7 поддерживают _Alignasдля элементов структуры без жалующийся (с -педантичным). Исходный код Clang воспроизводит та же грамматика из N1570, за исключением Parser::ParseSpecifierQualifierList разрешает спецификаторы выравнивания; функция содержит элемент TODO, хотя это гласит:

/// TODO: diagnose attribute-specifiers and alignment-specifiers.

Код синтаксического анализатора GCC C выглядит похожим, т. е. даже несмотря на то, что он цитирует стандартной грамматики, она позволяет указывать спецификаторы выравнивания в списки спецификаторов-квалификаторов.

Я также проверил список известных дефектов, а также comp.lang.c и comp.std.c, чтобы узнать, поднималась ли там тема, но она не похоже, что это так. Следовательно, мой вопрос: выравнивание спецификаторы должны быть разрешены для членов структуры?

РЕДАКТИРОВАТЬ: соответствующие правила грамматики:

// Compare this...
(6.7) declaration-specifiers:
           storage-class-specifier declaration-specifiers_opt
           type-specifier declaration-specifiers_opt
           type-qualifier declaration-specifiers_opt
           function-specifier declaration-specifiers_opt
           // This seems to be the only place that mentions
           // alignment-specifier on the rhs of a rule.
           alignment-specifier declaration-specifiers_opt

(6.7.2.1) struct-or-union-specifier:
           struct-or-union identifier_opt { struct-declaration-list }
           struct-or-union identifier

(6.7.2.1) struct-declaration-list:
           struct-declaration
           struct-declaration-list struct-declaration

(6.7.2.1) struct-declaration:
           specifier-qualifier-list struct-declarator-list_opt ;
           static_assert-declaration

// ...to this.
(6.7.2.1) specifier-qualifier-list:
           type-specifier specifier-qualifier-list_opt
           type-qualifier specifier-qualifier-list_opt
           // Missing alignment-specifier specifier-qualifier-list_opt?

(6.7.5) alignment-specifier:
          _Alignas ( type-name )
          _Alignas ( constant-expression )
6
задан rz0 20 May 2012 в 23:31
поделиться