首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变长数组类型操作数的_Alignof :标准中有矛盾吗?

变长数组类型操作数的_Alignof :标准中有矛盾吗?
EN

Stack Overflow用户
提问于 2022-02-23 15:54:01
回答 1查看 53关注 0票数 -3

C2x,6.5.3.4大号和_Alignof运算符,语义,2(强调后加):

如果操作数的类型是可变长度数组类型,则操作数是求值的;否则,将不计算操作数,结果是整数常量。

C2x,6.7.6.2数组声明器,语义,5(重点添加):

,其中大小表达式是_Alignof运算符操作数的一部分,该表达式是而不是计算

请考虑以下代码:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-23 20:21:56

这个标准被忽视了。

没有矛盾。

澄清:

C11,6.5.3.4大号和_Alignof运算符,语义,3(强调后加):

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

这意味着在

代码语言:javascript
复制
_Alignof( int(*)[ f() ] )

这个

代码语言:javascript
复制
int(*)[ f() ]

未评估。

因此,不调用f()

附加: ICC错误地产生一个错误:

代码语言:javascript
复制
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

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

包含在不计算

的子表达式中的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71240173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档