2

失敗した場合に NULL を返したい関数がいくつかありますが、成功した場合は何も返す必要はありません。を使用していますvoid * function_name(...)が、まだ何かを返す必要があります。

私がこれを行っている理由は、python C 拡張機能の一部として障害を検出するためであり、最も内側の関数が例外を設定し、NULL を返し、スタックを介してそれを行うことを推奨しています。

この状況でのベストプラクティスは何ですか? 0、-1、または同様のものを返しますか?

4

4 に答える 4

5

純粋な C 用語で言えば、成功/失敗を示すブール値フラグを返すのが最も簡単です。

Python との統合に関する限り、別のアプローチは次のとおりです。

PyObject* func() {
    ...
    if (error) {
        /* set the exception */
        PyErr_Format(PyExc_..., ...); /* TODO: fill in as appropriate */
        return NULL;
    }
    /* return None */
    Py_RETURN_NONE;
}
于 2013-06-26T14:05:11.410 に答える
3

C の多くの関数は、成功すると 0 を返し、失敗すると !0 を返します。これは良い開始規則ですが、最初は少し奇妙に見えるかもしれません。

!0 は、後日エラー コードに拡張できます (または、最初の差異の位置を生成する strcmp の戻り値などの有用なデータ)。OK の場合は 0 を保持します。

于 2013-06-26T14:06:20.633 に答える
1

intreturn 0、成功の場合は return 、失敗の場合のように負の値を返すことをお勧めし-1ます。これは多くのライブラリ関数に従います。

利点は、通常、複数の種類の失敗があり、intそれらを表すために異なるものを返すことができることです。

一方、ifステートメントで関数を使用すると、少し混乱するように見えます。

于 2013-06-26T14:05:11.340 に答える
0

あなたはCにいるので、BOOLEAN trueまたはfalseを使用できません。しかし、return 1 または 0 は問題ありません。

しかし、あなたはそのようにこれを行うことができます:

int yourFunction( ... )
{
   ...
   if ( success )
      return 1;
   return 0;
}

あるいは :

typedef int BOOL;
#define TRUE 1
#define FALSE 0

BOOL yourFunction()
{
    if ( success )
        return TRUE;
    else
        return FALSE;
}

または、別の応答で提案されているように、-1 と 0 を返します。

于 2013-06-26T14:10:50.497 に答える