5

私はマルチプラットフォームプロジェクトに取り組んでおり、一部のプラットフォームでは機能が無効になっています。これらの機能のインターフェイスで、私が行う一般的なことは次のようなものです。

bool Foo::bar() const {
    // disabled
    abort();
}

GCC / LLVMは、非void関数が値を返すことを要求しません(警告を出すだけです)。この場合、私が呼び出すとabort()、警告を出さないほど賢いです(関数はとにかく戻ることはないため)。

Visual C ++ 2010を同じように動作させる方法(コンパイルフラグ?)があるので、Windowsビルドを壊し続けませんか?中止後はいつでも値を返すことができることはわかっていますが、他のプラットフォームで作業しているときは、通常それを忘れており、エラーを出さないという動作の方が適切なようです。

4

3 に答える 3

4

__declspec(noreturn)MSVC++コンパイラでこの効果があるはずです。標準abortはとして宣言されると思い__declspec(noreturn)ます。しかし、コンパイラはあなたの例でエラーを生成するので、おそらくそのように宣言されていません。の宣言を確認することをお勧めしますabort。含まれていない場合は__declspec(noreturn)、なんとかして追加する必要があります。

于 2012-07-08T19:50:18.930 に答える
2

一般に、Visual C ++コンパイラでは、関数に注釈__declspec(noreturn)を付けて、関数が戻らないことを示すことができます。これにより、コンパイラは、このような関数を呼び出した後のコードに到達できないことを認識できます。

ここで発生している問題は、このSOの質問でカバーされています。話を短くするためabort()に、VisualC++ランタイムヘッダーにこの注釈を付けないでください。

于 2012-07-08T19:50:44.790 に答える
1

エラーをコンパイルフラグとして追加することを無効にしたいので/w34716(警告レベル3以上を使用していると仮定)、警告のみが発行されるようになりました(警告レベルが3以上の場合)。警告()を無効にすることもできますが/wd4716、この動作による警告の数によっては、それはおそらくお勧めできません。

于 2012-07-08T20:02:20.320 に答える