我读了关于属性的这个问题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属性后返回?
在我的工作场所,我们有一个不同的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返回给调用者.
这与我的问题有关吗?