8

私が次の機能を持っているとしましょう:

Thingy& getThingy(int id)
{
    for ( int i = 0; i < something(); ++i )
    {
        // normal execution guarantees that the Thingy we're looking for exists
        if ( thingyArray[i].id == id )
            return thingyArray[i];
    }

    // If we got this far, then something went horribly wrong and we can't recover.
    // This function terminates the program.
    fatalError("The sky is falling!");

    // Execution will never reach this point.
}

コンパイラは通常、「すべての制御パスが値を返すわけではない」と不平を言います。これは技術的には正しいですが、値を返さない制御パスは、関数が終了する前にプログラムを中止するため、意味的に正しいものです。警告を完全に抑制したり、無意味なダミーを返したりせずに、このチェックの目的で特定の制御パスを無視することをコンパイラー(私の場合はVS2010ですが、他の人にも興味があります)に伝える方法はありますか?関数の最後の値?

4

3 に答える 3

12

関数fatalError(その宣言)に注釈を付けて、決して返されないことをコンパイラーに知らせることができます。

C ++ 11では、これは次のようになります。

[[noreturn]] void fatalError(std::string const&);

C ++ 11より前では、GCCなどのコンパイラ固有の属性があります。

void fatalError(std::string const&) __attribute__((noreturn));

またはVisualStudioの:

__declspec(noreturn) void fatalError(std::string const&);
于 2012-08-27T17:42:37.093 に答える
2

例外をスローしてみませんか?これで問題が解決し、呼び出し元のメソッドが例外を処理するように強制されます。

なんらかの方法で警告を処理した場合でも、getThingy()を呼び出す関数で何かをしなければならないことになります。getThingy()が失敗するとどうなりますか?発信者はどのように知るのでしょうか?ここにあるのは(概念的には)例外であり、設計はそれを反映している必要があります。

于 2012-08-27T17:44:55.833 に答える
1

fatalErrorルーチンの代わりにランタイムアサーションを使用できます。これは次のようになります。

Thingy& getThingy(int id)
{
    for ( int i = 0; i < something(); ++i )
    {
        if ( thingyArray[i].id == id )
            return thingyArray[i];
    }
    // Clean up and error condition reporting go here.
    assert(false);
}
于 2012-08-27T17:47:45.637 に答える