4

一部の関数呼び出しではコンパイルを失敗させたいが、他の関数呼び出しでは失敗させたい。失敗させたい関数呼び出しは、値が特定のタイプの場合に戻り値を処理しない関数呼び出しです。以下の例でErrorは、返される関数を処理しないことはコンパイルエラーですが、他のものを返す関数を処理しないことは問題なく成功するはずです。

注:ランタイム環境(組み込み)では、次の構成を使用できません:RTTI、例外。

このコードはClangでコンパイラーする必要があるだけで、各関数に注釈を付ける必要はありません。

実行時ではなくコンパイル時に失敗するソリューションをお勧めします。

enum class Error {
  INVAL,
  NOERR,
};

// do something that can fail.
Error DoThing();
// may return different return codes, we never care (we can't change prototype)
int DoIgnoredThing();

int main() {
  DoThing(); // compilation failure here, unused "Error" result
  DoIgnoredThing(); // compilation succeeds, OK to ignore unused "int" result
  return 0;
}
4

3 に答える 3

3

ストレート C++ でそれを行う方法はわかりませんが、g++ を使用している場合は、 -Werror=unused-result コマンドライン フラグとともにwarn_unused_result 属性を使用できます。それを指定する方法については、 warn_unused result のドキュメントを参照してください (残念ながら、すべての関数で指定する必要があります。タイプに対して指定できるとは思いません)。次に、コンパイラ フラグがその警告をエラーに変えます。

g++ を使用していない場合は、コンパイラに同様の機能がある可能性があります。

于 2012-09-14T00:34:30.613 に答える
0

私はあなたが望むことをするクラスを作るためにいくつかの方法を試しましたが、私は成功しませんでした。「戻り値」を参照によって渡される引数にすることを検討しましたか?これは、APIが戻り値に注意を払うことを強制するのを見た中で最も一般的な方法です。だから代わりに

Error DoThing();

あなたが持っている

void DoThing(Error& e);

DoThing()を呼び出すものはすべて、Errorオブジェクトを渡す必要があります。そうしないと、コンパイラエラーが発生します。繰り返しますが、あなたが求めていたものとは正確には異なりますが、おそらく十分ですか?

于 2012-09-14T11:57:49.477 に答える
0

コード分​​析ツールを使用してソース コードをスキャンする方が簡単な場合があります。

これにより、要求に応じて戻り値の型を使用したり、関数の別のマーカーを使用してコメントのようにテストしたりして、どの関数をチェックする必要があるかを示すことができます。

分析ツールは、コンパイル プロセスの一部として、またはビルド サーバーの一部として実行できます。

于 2012-09-14T00:27:38.867 に答える