我注意到,标准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时,你会检查所有的参数以使它正常工作,或者让它崩溃吗?
更好地提供强有力的类型,因此没有必要的检查。然后检查是更好的,但它不是免费的。所以出于性能原因,在几个接口中省略了检查(但是它应该在文档中)。 – Jarod42
[这次谈话(https://www.youtube.com/watch?v=1QhtXRMp3Hg)进入非常详细如何做到这一点,为什么。总之,您必须了解后果(绩效,合同变更),做出决定,记录并保持一致。 – nwp
只要您记录约束条件并说出_undefined behavior_,否则它可能是性能原因的合理选择。 – skypjack