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; }
<1>或者类似的检查参数是满足某种条件 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; }
1 lihongjie0209 2019-03-29 10:41:09 +08:00 看你怎么定义这个函数了 前置条件和后置条件了解一下 |
2 mooncakejs 2019-03-29 10:42:25 +08:00 via iPhone 被调函数做。 高频或者 内部函数不用做。 |
![]() | 3 jmc891205 2019-03-29 10:51:10 +08:00 如果现在以及将来都是只有同一个人调用 那谁做都可以 如果会有其他人来调用 那被调的要做 |
![]() | 4 wutiantong 2019-03-29 10:59:16 +08:00 为了解决这个问题现代语言引入了 optional 类型, 即使 C 语言里没有 optional 类型,你也应该效仿其思想, 关键点是要事先约定好参数是否允许为 null。 |
![]() | 5 wutiantong 2019-03-29 11:03:57 +08:00 应该尽可能的把 约束条件封装成类型,而不是使用裸的基本类型(指针,int, double )然后再写 check code |
![]() | 6 wutiantong 2019-03-29 11:06:13 +08:00 甚至通过最简单的 typedef 也能取得有意义的改进(通过类型名产生一种文档约定的效果) |
7 darknoll 2019-03-29 11:11:40 +08:00 是个好问题 |
![]() | 8 Yourshell 2019-03-29 11:25:53 +08:00 如何使用这个函数不应该由这个函数定义吗? |
9 Ahaochan 2019-03-29 11:32:03 +08:00 被调函数做,你不能保证调用你代码的人是怎样的一个人( |
![]() | 10 hx1997 2019-03-29 11:33:01 +08:00 via Android 统一约定好就行了吧,如果内部不检查,就要在文档或注释写清楚。 |
![]() | 11 geelaw 2019-03-29 11:39:33 +08:00 via iPhone 需要考虑的问题是: - 谁应该消费这个函数? - 潜在消费者和提供者之间有边界吗? - 怎样效率高? |
![]() | 12 miaoxia 2019-03-29 12:00:21 +08:00 via iPhone 函数内部已代码的方式做判断,外部已文档的方式通知。调用方基于文档安规则传值,如果没按规则,就会得到文档中提到的异常情况。 |
13 TreStone 2019-03-29 12:56:27 +08:00 via Android 模块内部接口调用调用者保证,对外接口被调者保证 |
14 MeteorCat 2019-03-29 13:13:00 +08:00 via Android 被调用参数做 |
![]() | 15 owenliang 2019-03-29 13:14:59 +08:00 via Android 对外提供一定要检查。 |
![]() | 16 Joyboo 2019-03-29 15:44:58 +08:00 如果一万个地方调用呢?难道做一万次检查 |
17 bp0 2019-03-29 17:02:03 +08:00 |
18 ian511 2019-03-29 17:08:48 +08:00 脱离不了从上下游实际 use case 考虑 |