函数参数检查,是调用的函数做,还是被调函数做?(假设都是同一个人写的)有什么原则吗,或者看心情。。。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zycpp
V2EX    C

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

  •  
  •   zycpp 2019-03-29 10:39:29 +08:00 3587 次点击
    这是一个创建于 2389 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    另外,内部函数不是不检查,而是用断言机制检查。
    ian511
        18
    ian511  
       2019-03-29 17:08:48 +08:00
    脱离不了从上下游实际 use case 考虑
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2818 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:43 PVG 21:43 LAX 06:43 JFK 09:43
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86