【问题标题】:no return statement in function returning non-void while using C++在使用 C++ 时返回非 void 的函数中没有返回语句
【发布时间】:2021-12-01 23:34:00
【问题描述】:

我正在尝试理解 return 函数中 return 语句的 C++(GCC 编译器)期望。

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

int foo() 
{ 
    throw "blah";
}

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

no return statement in function returning non-void 

例如:

void throw_blah() 
{
    throw "blah";
}

int foo() 
{ 
    throw_blah();
}

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

【问题讨论】:

  • 如果你永远不会返回一些东西,你为什么要声明函数这样做呢?如果您不打算返回任何东西,只需让它返回void。编译器试图通过发出警告/错误来帮助您解决此问题。
  • @NathanOliver 可以想象一个稍微复杂一点但完全合理的例子,比如int div_checked(a, b) { if(b) return a/b; else log_error_and_die(); }
  • @Sneftel 好点。我忘记了,如果所有路径都没有返回,它仍然会出现问题。

标签: c++ macros return compiler-warnings


【解决方案1】:

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

请注意,throw_blah 是奇怪的位,而不是 foo。例如,如果您从foo 调用exit 而不是throw_blah,它不会发出错误。那是因为exit 被标记为[[noreturn]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2011-06-06
    相关资源
    最近更新 更多