1

私は Visual C++ でかなり大きなプロジェクトを書いていますが、現在次のようなエラー チェック コードをクリーンアップする方法があるかどうか疑問に思っていました。

// A header full of error codes like this
#define NO_ERROR            0x0000
#define CASUAL_ERROR        0x0001
#define ERROR_IN_THE_MATRIX 0x0015

-

// An example source file
int error;
error = openGLObj->Initialize();
if (!(error == NO_ERROR)
    return error;

ご覧のとおり、ほぼすべての関数呼び出しの後にエラー チェック コードを記述しなければならない場合、エラー チェック コードは多くの画面スペースを占有します。

だから私はこのようなことを実験しました:

// Second example source file
int error;
error = fbxParser->ParseVertexData(...);
if (error)
    return error;

エラーがなく、他の整数がブール値をtrueに設定しているように見える場合は常にNO_ERROR(int 0)を返すため、少なくともVisual C ++では機能するようです。

後者は物事を行うための適切な方法ですか?それとも、後で問題が発生し、if ステートメントの変換に (再び) 何時間も費やす必要がありますか?

4

3 に答える 3

3

これは主にスタイルと個人的な好みの問題です。

個人的には、意味のあるゼロ以外の値を複数持つことができる式を条件として扱うのは嫌いです。たとえば、次のように書きます。

if (ptr != NULL)

それよりも

もし (!ptr)

どちらもまったく同じ意味ですが。逆に、式「論理的に」ブール値である場合 (型であるかどうかにbool関係なく)、条件として直接使用することを好みます。

if (isdigit(foo))

それよりも

if (isdigit(foo) != 0)

と:

bool cond;
// ...
if (cond)
// or
if (!cond)

そしてそうではない

if (cond == true)
if (cond == false)

だからあなたの場合、私は書きます:

if (error != NO_ERROR)
    return error;

(演算子の結果に!=適用するのではなく、演算子を使用していることに注意してください)。!==

明示的な比較により、読者は何が何でerrorあるかを理解するためのより多くのコンテキストを得ることができます。、または、または、NO_ERRORではなく、と比較しています。00.0NULL'\0'

純粋なブール値である場合error、私はif (error).

何度も言いますが、これは個人の好みの問題です。あなたの定義を考えると、これは:

if (error)

は次とまったく同じです:

if (error != NO_ERROR)

期待どおりに動作することを信頼できます。ifステートメント内の条件は、暗黙的に に変換されます。boolこれは、不等式を と比較することと本質的に同等0です。

したがって、期待どおりに動作しないことを心配する必要はありませんif (error)。また、最新のコンパイラを使用すると、コンパイラがどちらの形式でも効率の悪いコードを生成することを心配する必要はありません。より読みやすいと思われるものを使用してください。(書き込み不可。コードは、書き込まれるよりも何度も読み取られることに注意してください。)

于 2013-03-27T18:07:17.037 に答える
2

はい、ブールコンテキストの整数/浮動小数点数は、ゼロ以外の場合、真として解釈されます。NULL でない場合、ポインタは true として解釈されます。ただし、(error != NO_ERROR)の代わりに書くこともできることに注意してください!(error == NO_ERROR)

多くの場合、例外と RAII イディオムはエラー処理を簡素化します。これらは、これらの構文上の変更よりも効果的です。

于 2013-03-27T18:03:59.183 に答える
1

NO_ERROR が常にゼロであると仮定すると、あなたがしていることは問題ありません。

于 2013-03-27T17:57:52.827 に答える