抑制非常有用的警告 "control may reach end of non-void function"
Suppress non-trivially useless warning "control may reach end of non-void function"
这更像是一个方便的问题,但我想知道是否有任何方法可以抑制警告:
control may reach end of non-void function [-Wreturn-type]
对于我知道代码没有问题的特定情况。我的代码库中有一些用于抛出异常的辅助函数,对于这样的代码:
int foo(int i) {
if (i > 10) {
return i*10;
}
else {
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
}
}
我知道它要么 return,要么抛出,无论如何。因此这个警告在我看来毫无用处,只是编译器无法确定控制流路径最终会抛出异常。
我仍然希望看到这个警告弹出窗口,因为它实际上是代码错误的标志(即路径不 return 或抛出)。
是否可以通过便携方式实现?
编辑:忘记添加我正在使用的编译器,
Apple LLVM version 8.1.0 (clang-802.0.41)
在我看来,您的编译器无法看到内部 Exception::throwExcept
知道它总是抛出异常。
使用原始 C++ 异常帮助编译器 throw
作为函数的最后一行:throw std::exception("Just to help the compiler know to not warn here");
这不会影响性能,因为代码永远不会执行。
抑制错误的一种快速而肮脏的方法是在 return 语句中使用逗号运算符。如果你使用
return Exception::throwExcept(MyCustomException("Error: i not in the accepted range")), 0;
编译器会看到 return 语句,但它永远不会像
那样实际执行
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"))
会先抛出 return 0.
标记 Exception::throwExcept
函数 [[noreturn]]
应该可以帮助编译器弄清楚它实际上不会 return。
编译器无法计算出 Exception::throwExcept()
不会 return。这里有两种解决方案。一种是告诉编译器,即
struct Exception
{
[[noreturn]] static void throwExcept(SomeType const&);
};
(clang 的 -Wmissing-noreturn
,包含在 -Weverything
中,如果上述函数可以声明为 [[noreturn]]
但不是,则会发出警告)或将函数重新安排为
int foo(int i) {
if (!(i>10))
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
return i*10;
}
这更像是一个方便的问题,但我想知道是否有任何方法可以抑制警告:
control may reach end of non-void function [-Wreturn-type]
对于我知道代码没有问题的特定情况。我的代码库中有一些用于抛出异常的辅助函数,对于这样的代码:
int foo(int i) {
if (i > 10) {
return i*10;
}
else {
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
}
}
我知道它要么 return,要么抛出,无论如何。因此这个警告在我看来毫无用处,只是编译器无法确定控制流路径最终会抛出异常。
我仍然希望看到这个警告弹出窗口,因为它实际上是代码错误的标志(即路径不 return 或抛出)。
是否可以通过便携方式实现?
编辑:忘记添加我正在使用的编译器,
Apple LLVM version 8.1.0 (clang-802.0.41)
在我看来,您的编译器无法看到内部 Exception::throwExcept
知道它总是抛出异常。
使用原始 C++ 异常帮助编译器 throw
作为函数的最后一行:throw std::exception("Just to help the compiler know to not warn here");
这不会影响性能,因为代码永远不会执行。
抑制错误的一种快速而肮脏的方法是在 return 语句中使用逗号运算符。如果你使用
return Exception::throwExcept(MyCustomException("Error: i not in the accepted range")), 0;
编译器会看到 return 语句,但它永远不会像
那样实际执行Exception::throwExcept(MyCustomException("Error: i not in the accepted range"))
会先抛出 return 0.
标记 Exception::throwExcept
函数 [[noreturn]]
应该可以帮助编译器弄清楚它实际上不会 return。
编译器无法计算出 Exception::throwExcept()
不会 return。这里有两种解决方案。一种是告诉编译器,即
struct Exception
{
[[noreturn]] static void throwExcept(SomeType const&);
};
(clang 的 -Wmissing-noreturn
,包含在 -Weverything
中,如果上述函数可以声明为 [[noreturn]]
但不是,则会发出警告)或将函数重新安排为
int foo(int i) {
if (!(i>10))
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
return i*10;
}