C语言 为什么关于将数组转换为指针的规则中缺少_Alignof?



>C 2011 (草案 N1570( 6.3.2.1 3 说:

除非它是sizeof运算符、_Alignof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为">type的数组"的表达式将转换为类型为"指向类型的指针"的表达式,该表达式指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义。

C 2018 6.3.2.1 3 说:

除非它是sizeof运算符或一元运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为">array-type"的表达式将转换为类型为">指针类型"的表达式,该表达式指向数组对象的初始元素,而不是左值。如果数组对象具有寄存器存储类,则行为未定义。

为什么后者缺少_Alignof

C 2018 福里沃德 7 说:

此版本没有重大更改,只有技术更正和澄清。

这意味着从数组转换规则中免除_Alignof存在错误,导致其被删除。但是,应该可以将_Alignof应用于数组,如C 2018 6.5.3.4 3所说:

_Alignof运算符产生其操作数类型的对齐要求。不计算操作数,结果为整数常量。当应用于数组类型时,结果是元素类型的对齐要求。

在 C11 和 C18 标准中,_Alignof运算符可以将类型名称作为操作数,但不能具有表达式。从C11草案标准§6.5.3:

Syntax
unary-expression:
postfix-expression
++ unary-expression
-- unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-name )
_Alignof ( type-name )
unary-operator: one of
& * + - ~ !

sizeof运算符可能具有表达式或括号类型名称作为操作数,但由于使用括号类型名称以外的任何内容作为_Alignof参数都是违反约束的,因此此处根本不需要数组转换的特殊例外。


事实证明,更改是在N1570草案标准发布和C11标准(ISO/IEC 9899:2011(最终发布之间进行的。在这个SO答案中有一些讨论,它引用了这个谷歌网上论坛帖子中的讨论,ISO C委员会的拉里琼斯建议:

最大的变化_Alignof是从 一堆不应该添加的地方(基于错误的 它像sizeof一样接受类型或表达式的概念 当它实际上只需要一个类型时(:6.3.2.1p2, p3, p4, fn. 65;和 6.7.1 注121。

最新更新