相关疑难解决方法(0)

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

我读了关于属性的这个问题noreturn,它用于不返回调用者的函数.

然后我用C做了一个程序.

#include <stdio.h>
#include <stdnoreturn.h>

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

int main()
{
        func();
}
Run Code Online (Sandbox Code Playgroud)

并使用以下代码生成代码的汇编:

.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
Run Code Online (Sandbox Code Playgroud)

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

c assembly function-call c11 noreturn

71
推荐指数
8
解决办法
1万
查看次数

错误:声明'noreturn'的函数不应该返回

在我的工作场所,我们有一个不同的noreturn属性内部名称.假设它是INTERNAL_DONT_RETURN

我正在写一个类的成员函数,我在那里做类似的事情

INTERNAL_DONT_RETURN void foo() const
{
    if(!*this)
    {
       throw CoolException();
    }
    m_call_throw();
}
Run Code Online (Sandbox Code Playgroud)

这个m_call_throw()是一个私有类成员std::function<void()>m_call_throw ,它作为lambda填充在类的构造函数中.这个lambda什么也没做

m_call_throw([uncoolID]() { throw UncoolException(uncoolID); })

现在两者,gcc-4.9.3和clang都给了我以下警告

error: function declared 'noreturn' should not return [-Werror,-Winvalid-noreturn] } ^

我已经咨询了这个这个问题,但没有人解释上述警告的原因.

1)编译器隐加入return作为解释在这里

2)即使我抛出异常,为什么编译器认为我的函数会返回?

3)noreturn属性提到

当适用时,noreturn关键字不会影响异常路径:noreturn-marked函数仍然可以通过抛出异常或调用longjmp返回给调用者.

这与我的问题有关吗?

c++ lambda gcc c++11

3
推荐指数
1
解决办法
2458
查看次数

标签 统计

assembly ×1

c ×1

c++ ×1

c++11 ×1

c11 ×1

function-call ×1

gcc ×1

lambda ×1

noreturn ×1