在C中为库设计公共错误代码

时间:2019-04-21 12:46:45

标签: c api-design library-design

我要解决的一个设计问题是使客户端能够处理调用库函数时可能发生的错误的灵活方法是什么?我看到2种方法:

I。 。将所有库函数引发的所有错误放入公共的单独头文件中,例如 lib_errors.h

#define APP_ERR_OBJECT_TOO_SMALL 1 /* The object is too small */

#define APP_ERR_HOST_UNREACHABLE 2 /* Host is not reachable */

#define APP_ERR_UNKNOWN          3 /* Unknown error */

并将其包含在库的所有公共头文件中。

header1.h

#include "lib_errors.h"

/**
 * -1 - on error 
 *      error_code is set to APP_ERR_OBJECT_TOO_SMALL the buf is too small
 *      error_code is set to APP_ERR_UNKNOWN in case of unknown error
 */ 
int hdr1_drain(void *buf, size_t sz, int *error_code);

header2.h

#include "lib_errors.h"

/**
 * -1 - on error 
 *      error_code is set to APP_ERR_HOST_UNREACHABLE if the host is unreachable
 *      error_code is set to APP_ERR_UNKNOWN in case of unknown error
 */ 
int hdr2_connect(char *add, int *error_code);

我看到的问题:库可能引发的所有错误都将包含在每个头文件中,即使标头本身没有引发这些错误。

II。 。要在每个头文件中定义特定于头的错误:

header1.h

#define HDR1_OBJECT_TOO_SMALL 1
#define HDR1_UNKNOWN          2

header2.h

#define HDR2_HOST_UNREACHABLE 1
#define HDR2_UNKNOWN          2

我看到的问题:重复代码的数量随着常见错误的数量而增加。所有常见错误都必须在每个公共头文件中重复。

所以我目前很困惑要选择哪个。可能存在另一种解决设计问题的方法。第一种方法似乎更接近POSIX errno

1 个答案:

答案 0 :(得分:2)

您可以结合使用两种方法。将所有常见错误放在一个标头中,然后将应用程序特定的错误放在应用程序标头中。

lib_errors.h:

#define ERR_UNKNOWN 1
...
#define LIBERR_LAST 100

header1.h:

#include "lib_errors.h"

#define HDR1_OBJECT_TOO_SMALL (LIBERR_LAST + 1)
...

header2.h:

#include "lib_errors.h"

#define HDR2_HOST_UNREACHABLE (LIBERR_LAST + 1)
...