LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1009|回复: 9

多层调用函数检查的问题....

[复制链接]
发表于 2005-12-1 08:55:34 | 显示全部楼层 |阅读模式
假如这样一个东东

funcA(int x){
chick_if_fail_return(x);
...
}


funcB(int x){
chick_if_fail_return(x);
funA(x);
...
}


funcC(int x){
chick_if_fail_return(x);
funB(x);
...
}

我在每个函数中都调用了chick_if_fail_return(x)检查参数是否在要求的范围内,然而这样重复的检查似乎是对资源的浪费,尤其是要检查的对象比较复杂的时候。最近看gtk+的实现的,发现他们的函数中也有许多重复检查的情况。

针对这种情况,大家是怎么看的?有没有什么处理的经验?
发表于 2005-12-1 09:49:59 | 显示全部楼层
用宏来检查好了,干嘛要用函数检查
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-1 16:18:34 | 显示全部楼层
用宏不也需要花时间,我想知道多次的检查究竟是否必要,如果不必要,在那里检查比较合适。
回复 支持 反对

使用道具 举报

发表于 2005-12-1 22:28:03 | 显示全部楼层
尽量保留吧,或许以后可能会在chick_if_fail_return(x)和funX(x)之间插入某些可能修改x的代码,想办法优化检查对象的代码。
回复 支持 反对

使用道具 举报

发表于 2005-12-5 23:11:22 | 显示全部楼层
如果每次检查都一样,有个建议:
  1. #define enter_crit func(x,1)
  2. #define leave_crit func(x,-1)
  3. void func(x,int add)
  4. {
  5.     static int reenter = -1;
  6.      reenter += add;
  7.      if(!reenter)
  8.      // do some check with x
  9. }
复制代码

进入函数后,先调用enter_crit,函数返回前,调用leave_crit
回复 支持 反对

使用道具 举报

发表于 2005-12-6 00:49:18 | 显示全部楼层
assert 之,要速度的时候 -DNDEBUG 编译
回复 支持 反对

使用道具 举报

发表于 2005-12-6 12:56:44 | 显示全部楼层
这样成不?
  1. int checkfunc(float x)
  2. {
  3.     if (x > -1 && x < 1)
  4.         return 0;
  5.     else
  6.         return -1;
  7. }

  8. static int (*rcheck)(float) = checkfunc;

  9. void funcA(float x)
  10. {
  11.     if (rcheck) {
  12.         rcheck(x);
  13.         rcheck = NULL;
  14.     }
  15. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-12-6 13:53:15 | 显示全部楼层
具体情况具体分析

如果某个参数在完全正确的程序里是不会被传进非法的值,那么就用assert,
编译release版时编译器会自动清空assert的处理内容。

如果是库,除非是最底层的库,例如ansi c的标准库,才会因为效率问题把
参数检查留给上层外,除此之外,都应该做参数合法性检查,原则就是不应
该由库搞死用户的程序,因为那个时候问题出在库的内部,往往无法用gdb跟
踪或者使用什么别的手段进行debug。

gcc里有专门的语言扩展来帮助编译器生成对那种分支生成大部分情况下损耗
可以忽略不计的机器码。
回复 支持 反对

使用道具 举报

发表于 2005-12-6 19:56:16 | 显示全部楼层
感觉应该看看
chick_if_fail_return(x);
是怎么个实现。没准已经进行了优化了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-6 20:32:14 | 显示全部楼层
喔,真的有很多有意思的方法,多谢各位阿
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表