C 返回错误的首选方法是什么?

C 返回错误的首选方法是什么?,c,error-handling,api-design,C,Error Handling,Api Design,我一直致力于为库的公共API中的函数提供错误处理工具。例如,我有一些数据\u源和一个队列,函数是获取数据,当前看起来如下: typedef struct data_source data_source; typedef struct queue queue; /** * Returns: * 0 - on success * -1 - on data source failure * -2 - on queue overflow */ int get_data(data_sour

我一直致力于为库的公共API中的函数提供错误处理工具。例如,我有一些
数据\u源
和一个
队列
,函数是
获取数据
,当前看起来如下:

typedef struct data_source data_source;

typedef struct queue queue;

/**
 * Returns:
 *  0 - on success
 * -1 - on data source failure
 * -2 - on queue overflow
 */
int get_data(data_source *ds, queue *queue);
但是查看
POSIX
的errno方法,它们使用返回类型来指示发生了一些错误,并使用
errno
来设置错误代码。我不确定为我的库API使用
errno
是否是一个好的选择,但考虑到这个想法,我将按如下方式设计函数:

/**
 * Returns:
 *  0 - on success
 * -1 - on error and error_code is set to
 *      1 - if queue overflow occurs
 *      2 - if data source failure detected
 */
int get_data(data_source *ds, queue *queue, int *error_code);

第二个示例是用于错误处理的C方法吗(常见的|比第一个更可取?

errno是errno.h中的一个宏

将其视为系统或libs可能设置为某个值的外部int。也就是说,它不是lib函数的参数,而是一个全局int


如果要将返回值用作错误代码或使用errno,完全由您决定。

errno是errno.h中的宏

将其视为系统或libs可能设置为某个值的外部int。也就是说,它不是lib函数的参数,而是一个全局int


如果要将返回值用作错误代码或使用errno,完全由您决定。

是否有理由认为简单地抛出异常是不可行的?out参数
error\u code
是返回错误imho的一个好方法。例如,看看Windows COM如何处理错误。这样,您的函数签名就不会与错误处理耦合在一起。您可以随心所欲地返回值,但仍然可以实现错误检查机制。@WeatherVane这就是我要问的。在第一个示例中,我使用了返回值,但在
libc
函数中,返回类型为
int
,即
-1
0
,错误代码设置为
errno
。因此,我认为在错误代码中使用out参数更为常见。第二个参数将是一个更为一致的接口,因为返回值可能已经以不同的方式从不同的函数中给出了多个值。是否有原因说明简单地抛出异常是不可行的?out参数,
error\u code
,是返回错误imho的好方法。例如,看看Windows COM如何处理错误。这样,您的函数签名就不会与错误处理耦合在一起。您可以随心所欲地返回值,但仍然可以实现错误检查机制。@WeatherVane这就是我要问的。在第一个示例中,我使用了返回值,但在
libc
函数中,返回类型为
int
,即
-1
0
,错误代码设置为
errno
。因此,我认为在错误代码中使用out参数更为常见。第二种方法是更为一致的接口,因为返回值可能已经以不同的方式从不同的函数中给出了多个值。