C 错误处理:如果错误返回 int 代码 else 值?

问题描述

在 Go 中他们经常做整个 (err,val) 的事情,在 Rust 中他们做类似的事情(+ 语法糖)。

我不确定是否应该为我的每种类型都使用这种类型的 struct

typedef struct {
    int status;
    char *const *c_str_arr;
    size_t size;
} StatusAndarrayCStrArray;

extern void cleanup_struct_cstr_array(StatusAndarrayCStrArray *status_and_array) {
    if (status_and_array->c_str_arr != NULL) {
        free((void *) status_and_array->c_str_arr);
        status_and_array->size = 0;
    }
}

static const StatusAndarrayCStrArray statusAndarrayCStrArrayNull = {
    EXIT_FAILURE,NULL,0
};

这似乎浪费了很多空间。也许 union 会更好? - 我也看到了一些 perror 的东西,所以也许我的意思是设置一个错误代码并返回值,然后首先检查是否有错误,否则 perror 方式返回值?

相关:Error handling in C code

解决方法

  1. 据我所知,c_str_arr 保留了错误消息。它不必是该结构的一部分。它不必驻留在 RAM 中(如果 RAM 是一个问题 - 例如 uC 编程)。在 .rodata 中有第二个包含错误消息的数组。

  2. size 可能是消息字符串的长度。如果消息字符串是以空字符结尾的 C 字符串,则您根本不需要。我认为这里不需要动态分配。

  3. 最终您只需要状态代码,不需要其他任何东西。

  4. extern void cleanup_struct_cstr_array 函数根据定义是外部函数,您不需要 extern 关键字

编辑(OP 评论):

所以我计划有几千个函数,每个函数返回 值或错误,来自远程服务器。

如果服务器将返回带有一些负载的完整消息,您不能使用指向该数据的指针,您需要将数据嵌入到消息中。

typedef struct {
    int status;
    size_t payload_size;
    char   payload[];
} StatusAndArrayCStrArray;

payload 将是从服务器返回的数据。它可以是错误消息或其他数据。也可以什么都没有。

最终,如果两个 size 都知道有效负载的大小(因为它是根据状态以某种方式定义的),您可能根本不需要 payload_size 成员。