首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么"noreturn“函数会返回?

为什么"noreturn“函数会返回?
EN

Stack Overflow用户
提问于 2017-08-31 20:32:00
回答 9查看 15.5K关注 0票数 74

我读到了关于noreturn属性的this问题,该属性用于不返回给调用者的函数。

代码语言:javascript
复制
#include <stdio.h>
#include <stdnoreturn.h>

noreturn void func()
{
        printf("noreturn func\n");
}

int main()
{
        func();
}

并使用this生成代码的汇编

代码语言:javascript
复制
.LC0:
        .string "func"
func:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $.LC0, %edi
        call    puts
        nop
        popq    %rbp
        ret   // ==> Here function return value.
main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $0, %eax
        call    func

为什么在提供func() noreturn 属性后,function 返回?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2017-08-31 20:35:18

C中的函数说明符是对编译器的一个提示,接受程度是由实现定义的。

首先,_Noreturn函数说明符(或者,noreturn,使用<stdnoreturn.h>)是对编译器的一个提示,表明程序员做出了一个理论上的承诺,这个函数永远不会返回。基于这个承诺,编译器可以做出一定的决策,对代码生成进行一些优化。

behaviour is undefined

为了清楚起见,使用noreturn函数说明符不会停止函数返回给调用者。这是程序员对编译器做出的承诺,允许编译器在一定程度上生成优化的代码。

现在,以防万一,你早晚做出了承诺,选择违反它,结果是UB。当_Noreturn函数似乎能够返回其调用方时,鼓励编译器生成警告,但不是必需的。

示例2中止无效f () { _Noreturn ();// ok } _Noreturn void g (int i) { //如果I <= 0 if (i > 0) _Noreturn();}会导致未定义的行为

对于C++来说,这种行为非常相似。

如果在先前使用f noreturn 属性声明了noreturn的位置调用了函数,并且<>e147>最终返回,则行为未定义。注意:该函数可能会抛出异常而终止。-end笔记

-end备注]

3[示例:

[ noreturn ] void f() {抛出“错误”;//确定}[ noreturn ] void q(int i) { //如果使用参数<= 0调用,如果(i > 0)抛出“正”,则行为未定义;}

-end示例]

票数 122
EN

Stack Overflow用户

发布于 2017-08-31 20:35:35

为什么函数func()在提供无返回属性后返回?

因为你写的代码告诉它。

如果你不想让你的函数返回,可以调用exit()或者abort()或者类似的函数,这样它就不会返回。

在调用printf()之后,除了返回之外,您的函数还能做什么

6.7.4函数说明符中的C Standard第12段特别包含了一个可以实际返回的noreturn函数的示例,并将该行为标记为未定义

示例2

代码语言:javascript
复制
_Noreturn void f () {
    abort(); // ok
}
_Noreturn void g (int i) {  // causes undefined behavior if i<=0
    if (i > 0) abort();
}

简而言之,noreturn是对您的代码施加的限制-它告诉编译器“我的代码永远不会返回”。如果你违反了这个限制,那都是你的错。

票数 51
EN

Stack Overflow用户

发布于 2017-08-31 21:36:40

noreturn是一个承诺。您告诉编译器,“这可能很明显,也可能不明显,但我知道,根据我编写代码的方式,这个函数永远不会返回。”这样,编译器就可以避免设置允许函数正确返回的机制。省略这些机制可能会让编译器生成更高效的代码。

一个函数怎么能不返回呢?一个例子是如果它调用exit()

但是,如果你向编译器承诺你的函数不会返回,而编译器没有安排函数正确返回,然后你去写一个返回的函数,那么编译器应该做什么呢?它基本上有三种可能性:

  1. 对您很“友好”,并想办法让函数正常返回。
  2. 会发出代码,当函数错误返回时,它会崩溃或以任意不可预测的方式运行。
  3. 会给您一条警告或错误消息,指出您违背了承诺。

编译器可能会执行1、2、3或某种组合。

如果这听起来像是未定义的行为,那是因为它确实如此。

正如在现实生活中一样,编程的底线是:不要做出你不能信守的承诺。其他人可能已经根据你的承诺做出了决定,如果你违背了你的承诺,就会发生糟糕的事情。

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

https://stackoverflow.com/questions/45981545

复制
相关文章

相似问题

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