我有一些函数我想在失败时返回 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 的返回产生第一个差异的位置);保留 0 表示 OK。
我建议返回int
,0
成功返回,失败返回负值-1
,这遵循许多库函数。
好处是,通常有多种失败,你可以返回不同int
的来表示它们。
另一方面,在if
语句中使用函数似乎有点混乱。
正如您在 C 中一样,您不能使用 BOOLEAN true 或 false。但返回 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,如另一个响应中所建议的那样。