-3

C2x,6.5.3.4 sizeof 和 _Alignof 运算符,语义,2(已添加重点):

如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

C2x,6.7.6.2 数组声明符,语义,5(强调):

如果大小表达式是运算符操作数的一部分,则不计算_Alignof该表达式。

考虑这段代码:

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?

4

1 回答 1

0

标准被忽视了。

没有矛盾。

澄清:

C11, 6.5.3.4 sizeof 和 _Alignof 运算符,语义,3(已添加重点):

_Alignof运算符产生其操作数类型的对齐要求。不计算操作数,结果是一个整数常量。

这意味着在

_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

这里允许函数调用,因为这样的函数调用

包含在未计算的子表达式中

于 2022-02-23T20:21:56.127 回答