问题描述
在 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 方式返回值?
解决方法
-
据我所知,
c_str_arr
保留了错误消息。它不必是该结构的一部分。它不必驻留在 RAM 中(如果 RAM 是一个问题 - 例如 uC 编程)。在 .rodata 中有第二个包含错误消息的数组。 -
size
可能是消息字符串的长度。如果消息字符串是以空字符结尾的 C 字符串,则您根本不需要。我认为这里不需要动态分配。 -
最终您只需要状态代码,不需要其他任何东西。
-
extern void cleanup_struct_cstr_array
函数根据定义是外部函数,您不需要extern
关键字
编辑(OP 评论):
所以我计划有几千个函数,每个函数返回 值或错误,来自远程服务器。
如果服务器将返回带有一些负载的完整消息,您不能使用指向该数据的指针,您需要将数据嵌入到消息中。
typedef struct {
int status;
size_t payload_size;
char payload[];
} StatusAndArrayCStrArray;
payload 将是从服务器返回的数据。它可以是错误消息或其他数据。也可以什么都没有。
最终,如果两个 size 都知道有效负载的大小(因为它是根据状态以某种方式定义的),您可能根本不需要 payload_size
成员。