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 的返回产生第一个差异的位置);保留 0 表示 OK。

于 2013-06-26T14:06:20.633 回答
1

我建议返回int0成功返回,失败返回负值-1,这遵循许多库函数。

好处是,通常有多种失败,你可以返回不同int的来表示它们。

另一方面,在if语句中使用函数似乎有点混乱。

于 2013-06-26T14:05:11.340 回答
0

正如您在 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,如另一个响应中所建议的那样。

于 2013-06-26T14:10:50.497 回答