微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 成员。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?