C2x,6.5.3.4大号和_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?
发布于 2022-02-23 20:21:56
这个标准被忽视了。
没有矛盾。
澄清:
C11,6.5.3.4大号和_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在这里,函数调用是允许的,因为这样的函数调用是
包含在不计算
的子表达式中的
https://stackoverflow.com/questions/71240173
复制相似问题