You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C2X标准有[[noreturn]]属性却未引入[[always_return]]属性?

既然C2X标准(文档编号n3301)中存在[[noreturn]]属性,为何没有引入[[always_return]]属性?

[[always_return]]的语义可定义如下:

被[[always_return]]属性修饰的函数必须始终返回至调用者。

引入[[always_return]]的目的是为编译器提供优化提示。

示例(摘自文档N3128):

extern void g(int x);
int f(int a, int b)
{
    g(b ? 42 : 43);
    return a / b;
}

编译器可以(乐观地)假设未定义行为(UB)不会发生,但只有当UB在抽象机层面的执行中实际发生时,才会产生不良后果。

在本示例中,g可能会终止程序(即不返回)。因此,编译器不能将b ? 42 : 43折叠为42——因为在抽象机层面a / b可能不会被执行,编译器也就不能假设b非零。

但如果g被[[always_return]]修饰,那么编译器就可以将b ? 42 : 43折叠为42,因为抽象机层面a / b一定会被执行,编译器可以假设b非零。


附:同样的问题也适用于[[may_return]]属性。


更新:要将b ? 42 : 43折叠为42,g不仅要始终返回,还不能有可观察行为(OB)。这是因为在C语言中,OB必须在UB之前发生。因此可能还需要更多属性:[[observable]]和[[noobservable]]。此时g的声明可以是:

extern [[always_return]] [[noobservable]] void g(int x);

内容的提问来源于stack exchange,提问作者pmor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:03:17