函数参数检查,是调用的函数做,还是被调函数做?(假设都是同一个人写的)有什么原则吗,或者看心情。。。

2019-03-29 10:39:29 +08:00
 zycpp

比如检查参数是否是空指针

void foo(int* a){
 // check if a is null ?
}

int* get_a(void){
 return NULL;
}

int main(){
 int* a= get_a();
 // check if a is null ?
 foo(a);
 return 0;
}

或者类似的检查参数是满足某种条件

void foo(const int& a){
 // check if a >0 ?
}

int get_a(void){
 return -1;
}

int main(){
 int a = get_a();
 // check if a >0 ?
 foo(a);
 return 0;
}
3225 次点击
所在节点    C
18 条回复
lihongjie0209
2019-03-29 10:41:09 +08:00
看你怎么定义这个函数了 前置条件和后置条件了解一下
mooncakejs
2019-03-29 10:42:25 +08:00
被调函数做。 高频或者 内部函数不用做。
jmc891205
2019-03-29 10:51:10 +08:00
如果现在以及将来都是只有同一个人调用 那谁做都可以
如果会有其他人来调用 那被调的要做
wutiantong
2019-03-29 10:59:16 +08:00
为了解决这个问题现代语言引入了 optional 类型,
即使 C 语言里没有 optional 类型,你也应该效仿其思想,
关键点是要事先约定好参数是否允许为 null。
wutiantong
2019-03-29 11:03:57 +08:00
应该尽可能的把 约束条件封装成类型,而不是使用裸的基本类型(指针,int, double )然后再写 check code
wutiantong
2019-03-29 11:06:13 +08:00
甚至通过最简单的 typedef 也能取得有意义的改进(通过类型名产生一种文档约定的效果)
darknoll
2019-03-29 11:11:40 +08:00
是个好问题
Yourshell
2019-03-29 11:25:53 +08:00
如何使用这个函数不应该由这个函数定义吗?
Ahaochan
2019-03-29 11:32:03 +08:00
被调函数做,你不能保证调用你代码的人是怎样的一个人(
hx1997
2019-03-29 11:33:01 +08:00
统一约定好就行了吧,如果内部不检查,就要在文档或注释写清楚。
geelaw
2019-03-29 11:39:33 +08:00
需要考虑的问题是:

- 谁应该消费这个函数?
- 潜在消费者和提供者之间有边界吗?
- 怎样效率高?
miaoxia
2019-03-29 12:00:21 +08:00
函数内部已代码的方式做判断,外部已文档的方式通知。调用方基于文档安规则传值,如果没按规则,就会得到文档中提到的异常情况。
TreStone
2019-03-29 12:56:27 +08:00
模块内部接口调用调用者保证,对外接口被调者保证
MeteorCat
2019-03-29 13:13:00 +08:00
被调用参数做
owenliang
2019-03-29 13:14:59 +08:00
对外提供一定要检查。
Joyboo
2019-03-29 15:44:58 +08:00
如果一万个地方调用呢?难道做一万次检查
bp0
2019-03-29 17:02:03 +08:00
@Joyboo 如果是一个外部函数,就算是一百万个地方调用,也要检查一百万次。因为你无法保证调用者按照约定去使用这个外部函数。

另外,内部函数不是不检查,而是用断言机制检查。
ian511
2019-03-29 17:08:48 +08:00
脱离不了从上下游实际 use case 考虑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/549811

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX