_Alignof 与变长数组类型的操作数:标准中是否存在矛盾?

发布于 2025-01-09 05:18:53 字数 1469 浏览 1 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葵雨 2025-01-16 05:18:53

标准被忽视了。

这并不矛盾。

澄清:

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

此处允许函数调用 is 因为这样的函数调用是

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

The standard was overlooked.

There is no contradiction.

To clarify:

C11, 6.5.3.4 The sizeof and _Alignof operators, Semantics, 3 (emphasis added):

The _Alignof operator yields the alignment requirement of its operand type. The operand is not evaluated and the result is an integer constant.

It means that in

_Alignof( int(*)[ f() ] )

the

int(*)[ f() ]

is not evaluated.

Hence, the f() is not called.

Extra: ICC incorrectly produces an error:

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

Here the function call is allowed because such funtion call is

contained within a subexpression that is not evaluated

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文