这是一个比任何事情都更方便的问题,但我想知道是否有任何方法可以抑制警告:
控制可能会达到非空函数的末尾[-Wreturn-type]
对于我知道的特定情况,代码没有问题。我的代码库中有一些辅助函数用于抛出异常,对于这样的代码:
int foo(int i) {
if (i > 10) {
return i*10;
}
else {
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
}
}
我知道无论如何,它会返回或抛出。因此,警告在我眼中是无用的,只是编译器无法确定控制流路径实际上会最终抛出。
我仍然希望看到这个警告弹出窗口,因为它实际上表示代码错误(即路径不返回或抛出)。
这可以通过便携方式实现吗?
编辑:忘记使用
添加编译器Apple LLVM版本8.1.0(clang-802.0.41)
答案 0 :(得分:10)
编译器无法确定struct Exception
{
[[noreturn]] static void throwExcept(SomeType const&);
};
不会返回。这里有两种解决方案。一个是告诉编译器,即
-Wmissing-noreturn
(包含在-Weverything
中的clang' [[noreturn]]
,如果上述功能可以声明为int foo(int i) {
if (!(i>10))
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
return i*10;
}
但是不是{或}},则会发出警告或重新安排作为
private WebView webViewNews;
private ProgressDialog progressDialogWebViewNews;
webViewNews = (WebView) findViewById(R.id.webViewNews);
WebSettings webSettings = webViewNews.getSettings();
webSettings.setJavaScriptEnabled(true);
webViewNews.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressDialogWebViewNews = new ProgressDialog(MainActivity.this);
progressDialogWebViewNews.setCancelable(false);
progressDialogWebViewNews.setTitle("Demo...");
progressDialogWebViewNews.setMessage("Demo");
progressDialogWebViewNews.show();
}
@Override
public void onPageFinished(WebView view, String url) {
progressDialogWebViewNews.dismiss();
super.onPageFinished(view, url);
}
});
webViewNews.loadUrl("http://www.demo.com");
答案 1 :(得分:7)
标记Exception::throwExcept
函数[[noreturn]]
应该有助于编译器确定它实际上不会返回。
答案 2 :(得分:2)
一种快速而肮脏的方法来抑制错误是在return语句中使用逗号运算符。如果你使用
return Exception::throwExcept(MyCustomException("Error: i not in the accepted range")), 0;
编译器将看到一个return语句,但它永远不会执行为
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"))
在它返回0之前会抛出。
答案 3 :(得分:1)
在我看来,你的编译器无法在Exception::throwExcept
内看到它总是抛出异常。
帮助编译器使用原始C ++异常throw
作为函数的最后一行:throw std::exception("Just to help the compiler know to not warn here");
这不会影响代码,因为代码永远不会被执行。