【发布时间】:2016-09-06 07:18:23
【问题描述】:
我注意到标准 c 库包含几个不检查输入参数(是否为 NULL)的字符串函数,例如 strcmp:
int strcmp(const char *s1, const char *s2)
{
for ( ; *s1 == *s2; s1++, s2++)
if (*s1 == '\0')
return 0;
return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
}
还有许多其他人不进行相同的验证。这是一个好习惯吗?
在其他库中,我看到他们检查每个参数,如下所示:
int create_something(int interval, int mode, func_t cb, void *arg, int id)
{
if (interval == 0) return err_code_1;
if (valid(mode)) return err_code_2;
if (cb == NULL) return err_code_3;
if (arg == NULL) return err_code_4;
if (id == 0) return err_code_5;
// ...
}
哪个更好?当您设计一个 API 时,您会检查所有参数以使其正常运行还是任其崩溃?
【问题讨论】:
-
最好提供强类型,因此不需要检查。然后检查更好,但它不是免费的。因此出于性能原因,在几个接口中都省略了检查(但应该在文档中)。
-
This talk 详细介绍了如何执行此操作以及原因。简而言之,您必须了解后果(绩效、合同变更)、做出决定、记录并保持一致。
-
只要您记录约束并说未定义的行为,否则出于性能原因,它可能是一个合理的选择。
-
这又是真正应该标记为 C 或 C++,但不能同时标记的问题之一。 C 根本没有
private函数,而在 C++ 中,有一种情况是private函数不需要检查它的参数(因为它们是从public函数调用的) -
@MSalters C 没有
private关键字,但 C 当然可以通过static函数来拥有私有函数。此外,关于 C 与 C++,我认为这是一个与语言无关的哲学问题。
标签: c api parameter-passing