gpt4 book ai didi

c - 如何处理 void 函数中的错误条件

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:19 24 4
gpt4 key购买 nike

出于学习目的,我正在用 C 编写一个数据结构和算法库(因此这不一定是万无一失的),我想知道 void 函数应该如何处理前提条件下的错误。如果我有一个销毁列表的函数,如下所示:

void List_destroy(List* list) {

/*
...
free()'ing pointers in the list. Nothing to return.
...
*/
}

它有一个前提条件 list != NULL,否则该函数将在调用者面前因段错误而崩溃。

据我所知,我有几个选择:第一,我放入 assert() 语句来检查前提条件,但这意味着该函数仍然 当着调用者的面发火(据我所知,这是图书馆的一大禁忌),但至少我可以提供错误信息;或两个,我检查先决条件,如果它失败,我跳到错误 block 并只是 return;,默默地继续前进,但调用者不知道 List* 为 NULL。

这些选项似乎都不是特别吸引人。此外,为简单的 destroy() 函数实现返回值似乎是不必要的。

编辑:谢谢大家。我决定为传递给函数的 NULL List* 指针实现(实际上是在我所有的基本列表函数中)一致的行为。所有函数都跳转到错误 block 并exit(1) 并沿着“Cannot destroy NULL list”行向stderr 报告错误消息。 (或推,或弹出,或其他)。我的理由是,调用者应该传递 NULL List* 指针确实没有合理的理由,如果他们不知道,那么我应该尽一切可能让他们知道。

最佳答案

析构函数(在抽象意义上,而不是 C++ 意义上)确实应该永远不会失败,无论如何。与此一致,free 被指定为在传递空指针时不执行任何操作而返回。因此,我认为您的 List_destroy 也这样做是合理的。

但是,提示崩溃也是是合理的,因为通常预期 C 库函数在传递无效指针时崩溃。如果你选择这个选项,你应该通过继续并取消引用指针并让内核触发 SIGSEGV 来崩溃,不是 assert,因为assert 具有不同的崩溃签名。

绝对不要更改函数签名,这样它可能会返回失败代码。这是 close() 的作者所犯的错误,40 年后我们仍在为此付出代价。

关于c - 如何处理 void 函数中的错误条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943380/

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