gpt4 book ai didi

c - 检查返回 int 的函数时出错

转载 作者:太空狗 更新时间:2023-10-29 17:10:18 25 4
gpt4 key购买 nike

如果我有一个返回某种指针的函数,我会通过在出错时将返回设置为 NULL 来检查错误。

char *foo(void) {
//If stuff doesn't go okay
return NULL;
}

char *bar = foo();
if(!bar) return 1;

这很好用,因为我知道在这种情况下我永远不会打算返回 NULL。

但是,有时我会有返回整数的函数(在这种情况下,我正在从配置文件中读取整数)。但是,问题是现在无法检查返回值是否有错误,因为任何值(包括 0)都可能是真实的。

一些解决方法:

  1. 在函数中包含错误代码参数
  2. 返回错误代码并包含一个 int 指针作为参数

这两个的问题是我有一组函数,它们都做同样的事情,但针对不同的类型,我想维护一个常规的接口(interface),以便它们可以以相同的方式使用。

是否有另一种解决方案不涉及更改函数的接口(interface)?处理这种情况的最常用方法是什么?

选择的解决方案

感谢您对此的所有想法和回答。

最后我决定,如果一个函数要返回一些数据,那么错误只能通过错误参数返回。否则直接返回错误。

我选择这个根是因为通常我发现当返回更复杂形式的数据时,潜在错误的数量几乎总是大于 1。这意味着无论如何使用 NULL 作为错误数据的唯一来源是不切实际的,因为它意味着无法确定错误到底是什么。由于函数以 int 形式返回数据,因此也无法区分多个不同的错误代码和有效数据。

当然,对于没有真正返回任何数据的函数,情况并非如此,在这种情况下,我可以随意使用返回值作为错误代码。

我还喜欢上面的模式明确区分返回数据的函数和不返回数据的函数。

最佳答案

全局变量有一个可怕的解决方案——类似于errno。不推荐。

您可能会使用一个函数来检索上次调用您集合中的某个函数的错误条件 - 同样,不推荐这样做。这不是线程安全的,您可能会跨函数共享错误 - 而不是能够从您使用的函数中查询最后一个错误(尽管可以通过适当的设计来修复)。

您可能决定所有函数都返回可测试的状态,并且该值通过指针参数返回。这为您提供了所有功能的一致性,并改变了使用模式。你会一直写:

if ((rc = your_function(in1, in2, &out)) != 0)
...handle error...
else
...use returned value...

这可能是最不令人讨厌的解决方案。

另一种主要替代方法是将指针传递给错误结构或将指针传递给错误结构的指针,这很容易导致资源管理问题。如果错误结构是固定大小,它就可以工作,这样资源管理问题就会消失。

Error_t err;

int result = your_function(in1, in2, &err);
if (err.code != 0)
...handle error...
else
...use returned value...

您不能在调用函数的同一行中测试错误条件,有些人会认为这很麻烦。当您处于一系列操作的第三个“else if”子句中时,这最重要 - 然后您必须引入一个新的嵌套级别,其中作为返回值的错误代码不需要它。有利的是,错误结构中的信息可以比单个错误编号更全面,这可能会导致更好的诊断。

您可以使用混合解决方案 - 一个错误返回代码和一个错误参数来包含用于改进诊断的额外信息。不过,据我所知,它很少被选中。

关于c - 检查返回 int 的函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4776329/

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