2017-06-12 14 views
3

これは何よりも便利な問題ですが、警告を抑制できる方法があるかどうかを知りたいと思います:非能動的な無用な警告を抑制する「制御は非void関数の終了に達する可能性があります」

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")); 
    } 
} 

私はそれは、どんな返さない、またはスローするかということを知っています。したがって、警告は私の目にはあまり意味がありません。コンパイラは、制御フローのパスが実際にスローされることを判断できません。

実際にコードが間違っている(つまり、返されない、またはスローされない)というサインの場合は、この警告ポップアップが表示されます。

移植可能な方法で可能でしょうか?

EDIT:あなたのコンパイラは、それは常に例外をスローすることを知っているException::throwExceptの内部を見ることができないようですが、私には見えます

Apple LLVM version 8.1.0 (clang-802.0.41)

+0

@Holt 'else'の有無にかかわらず、何も変更されません。 – JBL

+0

無意味な 'else'を削除してもまだ警告が出ますか? –

+1

'return例外:throwExcept(MyCustomException("エラー:私は受け入れられた範囲にありません "))、0'? – NathanOliver

答えて

10

コンパイラはException::throwExcept()が返されないことをコンパイラが認識できません。ここには2つの解決策があります。一つは、コンパイラに伝えるためであること、すなわち

struct Exception 
{ 
    [[noreturn]] static void throwExcept(SomeType const&); 
}; 

(打ち鳴らすの-Wmissing-noreturn-Weverythingに含まれる、[[noreturn]]を宣言していないが、できることの機能上の場合は警告が表示されます)、または

としての機能を再アレンジ
int foo(int i) { 
    if (!(i>10)) 
     Exception::throwExcept(MyCustomException("Error: i not in the accepted range")); 

    return i*10; 
} 
1

、私が使用しているコンパイラを追加し忘れました。

生のC++例外throwを関数の最後の行として使用してコンパイラを助けてください:throw std::exception("Just to help the compiler know to not warn here");これはコード以降のパフォーマンスを損なうことはありません。

+0

残念ながら私は 'throwExcept'関数を使いたいと思っています。長い話をすると、ネストされた例外が使用されていますが、私のビルドはクロスプラットフォームであり、サポートしていないMSVCバージョンです。だから、MSVCのバージョンをアップグレードすることができるまで、私は 'std :: nested_exception'とそれらの再実装の間で選択する関数が必要です。 – JBL

+0

@JBLマークは、あなたの 'throwExcept'を変更しないで、最後の行(決して到達しない)として何か「;」を追加することを意味します。 – Walter

+0

よろしいですか?もっと意味がある、私は間違っている。 – JBL

2

エラーを抑止するためのすばやく簡単な方法は、return文でカンマ演算子を使用することです。あなたは

return Exception::throwExcept(MyCustomException("Error: i not in the accepted range")), 0; 

を使用している場合、コンパイラは、return文が表示されますが、それはactualyそれがException::throwExcept機能[[noreturn]]マーキング0

+4

このハックは必要ではなく、読み込み/理解が難しいです。悪い習慣です。 – Walter

+1

他の回答のいくつかよりも読みにくく、混乱することは事実です。 :| – JBL

+1

@Walter私は同意しますが、私はそれを別の方法として提示します。あなたの答えははるかに良い(私はコードの行の周りの簡単な変更が好きです)と私の投票があります。 – NathanOliver

7

をすべき返すことができます前に、

Exception::throwExcept(MyCustomException("Error: i not in the accepted range")) 

がスローされますように実行することはありませんコンパイラが実際にはそれが返ってこないことを理解するのを助けます。

+0

MSVCでは '__declspec(noreturn)'となります。 –

+1

@CodyGray実際には、最新のMSVCのバージョンは '[[noreturn]]'を受け取ります。 – Holt

+0

さて、(最近のバージョンではこれらのサポートは検証されていませんでしたが)質問者は、別の回答にコメントして、例外をスローするためのラッパー関数を持っていた理由が、それはMSVCのバージョンではサポートされていなかったため、ツールチェーンに応じて適切な実装を選択する必要がありました。これはMSVCのバージョンがC++ 11の属性をサポートしない*ことを示唆しています。 –

関連する問題