首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  C/C++/Obj-C

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

  •  
  •   zycpp · 56 天前 · 1144 次点击
    这是一个创建于 56 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    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;
    }
    
    18 回复  |  直到 2019-03-29 17:08:48 +08:00
        1
    lihongjie0209   56 天前
    看你怎么定义这个函数了 前置条件和后置条件了解一下
        2
    mooncakejs   56 天前 via iPhone
    被调函数做。 高频或者 内部函数不用做。
        3
    jmc891205   56 天前
    如果现在以及将来都是只有同一个人调用 那谁做都可以
    如果会有其他人来调用 那被调的要做
        4
    wutiantong   56 天前
    为了解决这个问题现代语言引入了 optional 类型,
    即使 C 语言里没有 optional 类型,你也应该效仿其思想,
    关键点是要事先约定好参数是否允许为 null。
        5
    wutiantong   56 天前
    应该尽可能的把 约束条件封装成类型,而不是使用裸的基本类型(指针,int, double )然后再写 check code
        6
    wutiantong   56 天前
    甚至通过最简单的 typedef 也能取得有意义的改进(通过类型名产生一种文档约定的效果)
        7
    darknoll   56 天前
    是个好问题
        8
    Yourshell   56 天前
    如何使用这个函数不应该由这个函数定义吗?
        9
    Ahaochan   56 天前
    被调函数做,你不能保证调用你代码的人是怎样的一个人(
        10
    hx1997   56 天前 via Android
    统一约定好就行了吧,如果内部不检查,就要在文档或注释写清楚。
        11
    geelaw   56 天前 via iPhone
    需要考虑的问题是:

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

    另外,内部函数不是不检查,而是用断言机制检查。
        18
    ian511   56 天前
    脱离不了从上下游实际 use case 考虑
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   781 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 21:15 · PVG 05:15 · LAX 14:15 · JFK 17:15
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1