使用 C++ 时,函数中没有 return 语句返回非 void

Don*_*aka 1 c++ macros return compiler-warnings

我试图理解函数return中语句的 C++(GCC 编译器)期望non-void

例如,运行这段代码工作正常:

int foo() 
{ 
    throw "blah";
}
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我们尝试使用/调用某个函数来完成throw,它将面临众所周知的错误/警告:

no return statement in function returning non-void 
Run Code Online (Sandbox Code Playgroud)

例如:

void throw_blah() 
{
    throw "blah";
}

int foo() 
{ 
    throw_blah();
}
Run Code Online (Sandbox Code Playgroud)

我对此非常好奇,因为这与我的另一个问题之一直接相关,就像这里一样,throw工作正常,但使用macroforthrow面临同样的错误。

Sne*_*tel 5

编译器不会费很大的力气来检测这种情况,因为像这样throw_blah保证永远不会返回的函数很少见,而且因为除了最简单的情况之外,它没有办法可靠地这样做。如果您有一个类似throw_blah定义为永不返回的函数,您可以使用[[noreturn]]该属性告诉编译器,它会抑制警告。

请注意,这throw_blah是奇怪的一点,而不是foo。例如,如果您调用exit而不是throw_blahfrom foo,则不会发出错误。那是因为exit被标记为[[noreturn]].