_Alignof with operand of variable length array type: 标准是否有矛盾?
_Alignof with operand of variable length array type: is there a contradiction in the standard?
C2x,6.5.3.4 sizeof 和 _Alignof 运算符,语义,2(强调已添加):
If the type of the operand is a variable length array type, the operand is evaluated;
otherwise, the operand is not evaluated and the result is an integer constant.
C2x,6.7.6.2 数组声明符,语义,5(添加了重点):
Where a size expression is part of the operand of an _Alignof
operator, that expression is not evaluated.
考虑这段代码:
int f(void)
{
return _Alignof( int(*)[ f() ] );
}
问题:f()
应该被调用吗?
根据 6.5.3.4,操作数的类型是可变长度数组类型 => 计算操作数。
根据 6.7.6.2,大小表达式是 _Alignof
运算符的操作数的一部分 => 不计算该表达式。
标准是否有矛盾?
如果不是,那么是否意味着6.7.6.2的优先级高于6.5.3.4?
标准被忽略了。
没有矛盾。
澄清一下:
C11,6.5.3.4 sizeof 和 _Alignof 运算符,语义,3(强调已添加):
The _Alignof
operator yields the alignment requirement of its operand type. The operand is not evaluated and the result is an integer constant.
表示在
_Alignof( int(*)[ f() ] )
那个
int(*)[ f() ]
未评估。
因此,f()
没有被调用。
额外:ICC 不正确地产生错误:
int f(void);
int s = _Alignof( int(*)[ f() ] );
$ icc -std=c11 -pedantic -Wall -Wextra -c
error: function call is not allowed in a constant expression
此处允许函数调用,因为这样的函数调用是
contained within a subexpression that is not evaluated
C2x,6.5.3.4 sizeof 和 _Alignof 运算符,语义,2(强调已添加):
If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
C2x,6.7.6.2 数组声明符,语义,5(添加了重点):
Where a size expression is part of the operand of an
_Alignof
operator, that expression is not evaluated.
考虑这段代码:
int f(void)
{
return _Alignof( int(*)[ f() ] );
}
问题:f()
应该被调用吗?
根据 6.5.3.4,操作数的类型是可变长度数组类型 => 计算操作数。
根据 6.7.6.2,大小表达式是 _Alignof
运算符的操作数的一部分 => 不计算该表达式。
标准是否有矛盾?
如果不是,那么是否意味着6.7.6.2的优先级高于6.5.3.4?
标准被忽略了。
没有矛盾。
澄清一下:
C11,6.5.3.4 sizeof 和 _Alignof 运算符,语义,3(强调已添加):
The
_Alignof
operator yields the alignment requirement of its operand type. The operand is not evaluated and the result is an integer constant.
表示在
_Alignof( int(*)[ f() ] )
那个
int(*)[ f() ]
未评估。
因此,f()
没有被调用。
额外:ICC 不正确地产生错误:
int f(void);
int s = _Alignof( int(*)[ f() ] );
$ icc -std=c11 -pedantic -Wall -Wextra -c
error: function call is not allowed in a constant expression
此处允许函数调用,因为这样的函数调用是
contained within a subexpression that is not evaluated