失敗した場合に NULL を返したい関数がいくつかありますが、成功した場合は何も返す必要はありません。を使用していますvoid * function_name(...)
が、まだ何かを返す必要があります。
私がこれを行っている理由は、python C 拡張機能の一部として障害を検出するためであり、最も内側の関数が例外を設定し、NULL を返し、スタックを介してそれを行うことを推奨しています。
この状況でのベストプラクティスは何ですか? 0、-1、または同様のものを返しますか?
失敗した場合に NULL を返したい関数がいくつかありますが、成功した場合は何も返す必要はありません。を使用していますvoid * function_name(...)
が、まだ何かを返す必要があります。
私がこれを行っている理由は、python C 拡張機能の一部として障害を検出するためであり、最も内側の関数が例外を設定し、NULL を返し、スタックを介してそれを行うことを推奨しています。
この状況でのベストプラクティスは何ですか? 0、-1、または同様のものを返しますか?
純粋な C 用語で言えば、成功/失敗を示すブール値フラグを返すのが最も簡単です。
Python との統合に関する限り、別のアプローチは次のとおりです。
PyObject* func() {
...
if (error) {
/* set the exception */
PyErr_Format(PyExc_..., ...); /* TODO: fill in as appropriate */
return NULL;
}
/* return None */
Py_RETURN_NONE;
}
C の多くの関数は、成功すると 0 を返し、失敗すると !0 を返します。これは良い開始規則ですが、最初は少し奇妙に見えるかもしれません。
!0 は、後日エラー コードに拡張できます (または、最初の差異の位置を生成する strcmp の戻り値などの有用なデータ)。OK の場合は 0 を保持します。
int
return 0
、成功の場合は return 、失敗の場合のように負の値を返すことをお勧めし-1
ます。これは多くのライブラリ関数に従います。
利点は、通常、複数の種類の失敗があり、int
それらを表すために異なるものを返すことができることです。
一方、if
ステートメントで関数を使用すると、少し混乱するように見えます。
あなたは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 を返します。