[英]Structure member alignment with _Alignas
我想知道以下內容:C11中新的_Alignas
對齊說明符適用於結構成員嗎?
我總是假設那么多,但是對N1570公共草案的全面閱讀似乎表明, 對齊指定符不能出現在說明符限定符列表中,如果它被支持的話,這是我期望的那樣。 。 我已經閱讀了幾次語法,但無法弄清楚如何在結構成員聲明中允許_Alignas
。
但是,在我看來,該標准的意圖是_Alignas
應該適用於結構成員,因為_Alignas
(第6.7.5節)中的段落聲明“在[......的聲明中]不應指明對齊屬性。 ]一個比特字段“。 鑒於術語“位字段”在第6.7.2.1節中被定義為結構成員(精確的措辭:“這樣的成員稱為位字段 ”),我總是將該句子解釋為隱式意味着對齊說明符是允許非位字段成員。
檢查對現有實現表明,無論鏘3.0和4.7 GCC支撐_Alignas
上結構構件而不抱怨(與-pedantic
)。 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.7.5節,第6頁明確規定這也涉及成員的一致性
聲明的對象或成員的對齊要求被視為指定的對齊方式。
所以預期的語義就是那個。 如果正如你所說,語法的正式規范錯過了那一點(我沒有檢查),這是一個缺陷,你應該報告它。
編輯:查看語法,在我看來,在specifier-qualifier-list
的情況下,在6.7.2.1中添加了alignment-specifier
,並且第14段中的文本解釋也是有序的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.