我有一个函数,它显示一些消息,正确地完成程序,并最终调用exit(-1);
。下面是一个用法示例:
Data SomeFunction()
{
Data data;
if (some_condition) {
// filling the data
return data;
}
ShowErrorAndExit("Some message");
//return data - I don't want it here!
}
问题是,编译器说:
警告:控制到达非无效功能的末尾
但是,这不是真的,因为永远无法到达此函数的末尾。我不想在函数末尾添加不需要的返回;我还能做什么?
ShowErrorAndExit
应标记为[[noreturn]]
。这将删除警告。
示例:
[[noreturn]] void ShowErrorAndExit(std::string message) {...}
反转逻辑:
Data SomeFunction() {
if (!some_condition)
ShowErrorAndExit("Some message");
Data data;
// filling in the data
return data;
}
您可以(并且应该(使用[[noreturn]]
属性(链接(声明ShowErrorAndExit
函数。这将允许编译器(如果它合理理智的话(理解你的函数永远不会到达它发出警告的控制点。
类似这样的东西:
[[ noreturn ]] void ShowErrorAndExit(const char* message);
您可能会欺骗编译器,使其认为return
始终达到:
Data SomeFunction()
{
Data data;
if (! some_condition)
ShowErrorAndExit("Some message");
// fill the data
return data;
}
您可以忽略警告,或者,如果编译器提供了这样做的方法,则禁用它。另一种选择是在函数末尾放一个throw
,并附上一条注释,指示它永远不应该执行。
您可以使用std::optional
,它允许您返回类型Data
或什么都不返回,也就是std::nullopt
。看这里:https://en.cppreference.com/w/cpp/utility/optional