gpt4 book ai didi

c - C 语言中 Scala 的 Option 或 Rust 的 Result 错误处理

转载 作者:行者123 更新时间:2023-12-03 07:38:01 25 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

去年关闭。




Improve this question




在专业地使用 Scala 和 Python 一段时间后,我再次开始编写 C。
在使用了 Scala 的“Option”和“Either”错误处理模式并最近尝试了 Rust 方式之后,我想要在 C 中使用类似的东西。所以我想出了这样的东西:

typedef struct {
int age;
char* name;
} User;

typedef struct {
char* error;
User* value;
} UserResult;

UserResult get_user() {
/* Some complicated user fetching process .. that fails */
return (UserResult) { .error = "403 Unauthorized\n" };
}

int main(void) {
UserResult res = get_user();
if (res.error)
handle_error(res.error);
if (res.value)
do_something(res.value);
/* ... */
return 0;
}

但这并不是真的安全(我们可以访问无效的指针)。我怎样才能得到类似于 Scala 或 Rust 处理 C 错误的方法?

编辑:更正 UserResult 字段名称“值”

最佳答案

有很多方法可以处理现有 C 代码中的错误。如此之多以至于理解如何处理各种库的错误是一种不可忽视的心理负担,在项目中同时使用多个库时更是如此。

引入一种处理错误的新方法可能是有益的,但另一方面,它可能类似于 this famous XKCD comic

Rust(和 Scala 等)方式确实非常强大,并且比其他旧习语有一些优势。

但是, Result 习惯用法基于 Sum Types ,C 语言本身并不支持它。
无法保证您的 UserResult 处于一致状态。 usererror 可以为空,也可以为非空。

这可以稍微修改一下,例如通过使用 union 来代替:

typedef struct{
union {
char* error;
User user;
}
bool has_error;
} UserResult;
has_error 标志指示实际填充哪个字段:
int main(void) {
UserResult res = get_user();
if (res.has_error)
handle_error(res.error);
else
do_something(res.value);
/* ... */
return 0;
}

这并不完美,因为 C 语言没有强制执行正确的 union 访问,而是在使用不当时调用 undefined behaviour

关于c - C 语言中 Scala 的 Option 或 Rust 的 Result 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61178649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com