代码之家  ›  专栏  ›  技术社区  ›  Eric Postpischil

为什么将数组转换为指针的规则中缺少_Alignof?

  •  6
  • Eric Postpischil  · 技术社区  · 6 年前

    除非它是 接线员 _对齐 接线员,或一元 & 运算符,或是用于初始化数组的字符串文本,该表达式的数组类型为 转换为类型指针为 类型 指向数组对象的初始元素,而不是左值。如果数组对象具有register存储类,则行为未定义。

    C 2018 6.3.2.1 3表示:

    除非它是 尺寸 接线员,或一元 & 运算符,或是用于初始化数组的字符串文本,该表达式的类型为“array of” 类型 “转换为类型为”pointer to“的表达式 类型

    为什么是 _Alignof

    C 2018前言7:

    这意味着豁免是不正确的 从数组转换规则中删除。但是,应该可以应用 对于阵列,如C 2018 6.5.3.4 3所述:

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

    1 回复  |  直到 6 年前
        1
  •  9
  •   ad absurdum    6 年前

    在C11和C18标准中 _Alignof 运算符可以使用类型名作为操作数,但不能使用表达式。从 §6.5.3 of the C11 Draft Standard:

    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 运算符可以使用表达式或带圆括号的类型名作为操作数,但由于使用带圆括号的类型名以外的任何内容作为 _对齐 ,这里不需要特殊的数组转换异常。