gpt4 book ai didi

C - 制作 API 时进行 NULL 检查?

转载 作者:行者123 更新时间:2023-12-04 09:52:38 25 4
gpt4 key购买 nike

假设您正在为某种目的(例如数据结构)制作一个经过严格测试的相当健壮的 API。其他人将在他们自己的编码项目中下载和使用您的库,因此您希望它非常密封。

在您的 API 中,您有许多这样的函数调用:

void remove(struct myDataStruct *s, void* element_to_be_removed)
{
if (element_to_be_removed == NULL)
// Output an error, not allowed to enter NULL.
else if (isEmpty(s))
// Output an error, cannot remove something from empty structure.
else
{
// Everything is safe.
// Begin removing the element to the data structure.
}
}

如何添加以下内容:

if (s == NULL)
// Output an error, data structure initialized by user is NULL.

如果我决定也检查它,在将数据结构作为参数的每个 API 函数调用中,我都必须包括该检查。这是不好的做法吗?完全没有必要?对这类 NULL 检查的普遍共识是什么?如果我不检查 NULL 那么有人可以这样做:remove(NULL, NULL) 我的库会崩溃他的程序。

`

最佳答案

正如评论中所述,这个问题有很多方法。我将解释一种被广泛使用的方法及其优点。

要做什么,在示例/伪代码中

void remove(struct myDataStruct *s, void* element_to_be_removed)
{
// pre-conditions:
assert(s != NULL);
assert(element_to_be_removed != NULL);
assert(!isEmpty(s));

// implementation:
[...]

// optional post-conditions
// assert(s != NULL); <- maybe something more sensible
}

现在,这种方法的优点是什么:

  • 效率。在发布版本中,所有这些 assert() 都会消失。在调试构建中,他们将检查是否遵循了方法的约定,否则立即停止,从而帮助您的库的用户找到他出错的地方。
  • 可读性。您清楚地将契约(Contract)检查与您的业务逻辑分开。先决条件检查发生在方法的前几行,仅包含在 assert() 中。

当然,这只适用于传递例如参数的 NULL 被认为是调用代码中的错误。大多数时候,情况确实如此。它们甚至不会尝试发出有意义的错误并以某种方式恢复,而是快速失败。错误就是错误,继续执行程序毫无意义,这只会使调试复杂化。

如果传递 NULL 是意外的,但不是真正的错误,您应该改用“日志记录”方法。在您的示例中不是这种情况。

关于C - 制作 API 时进行 NULL 检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44341389/

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