Меня интересует следующее: является ли новое выравнивание _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 )