BBS.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


精彩推荐帖子 [函数] 大家在项目代码中会大量使用断言么?
首页 » 论坛 » C/C++ »  
投票标题: [函数] 大家在项目代码中会大量使用断言么?  (单选) [参与投票的会员]
在项目中使用了大量的断言。
项目中没有,自己平时写的程序偶尔会用到。
代码从来不使用断言。
对不起,您无权投票。


[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
  本主题由 converse 于 2008-8-17 21:26 加入精华 
77h2_eleven   帅哥
风云使者


CU奥运火炬传递手2008
UID:667394
注册:2008-2-5
最后登录: 2008-10-14
帖子:672
精华:1

可用积分:349 (白手起家)
信誉积分:20
专家积分:1 (本版:0)
空间积分:803
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2008-7-1 09:14 
这个投票只因为看《编程精粹》中,建议项目大量使用断言。
但是我们的项目都是采用条件判断+异常保护+日志。没有用过,惭愧。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

贵有恒,何必三更眠五更起。
最无益,只怕一日曝十日寒。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
lipingtababa
精灵




UID:585831
注册:2007-7-11
最后登录: 2008-10-16
帖子:231
精华:0

可用积分:237 (白手起家)
信誉积分:105
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2008-7-1 09:18 
断言有什么好处?



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
77h2_eleven   帅哥
风云使者


CU奥运火炬传递手2008
UID:667394
注册:2008-2-5
最后登录: 2008-10-14
帖子:672
精华:1

可用积分:349 (白手起家)
信誉积分:20
专家积分:1 (本版:0)
空间积分:803
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2008-7-1 09:22 


QUOTE:
原帖由 lipingtababa 于 2008-7-1 09:18 发表
断言有什么好处?

我感觉:
1 代码量小:往往一条语句就可以了。但是如果自己用宏定义等方式进行debug版本,代码两会多一些。
2 能够找出“程序员认为不可能发生的错误”:当然这个用宏定义debug版本等方式也能达到。
3 直观:是断言,别人一眼就能看出来。

总结就是定位自认为不可能发生的错误比较方便。

[ 本帖最后由 77h2_eleven 于 2008-7-1 09:23 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

贵有恒,何必三更眠五更起。
最无益,只怕一日曝十日寒。
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
lipingtababa
精灵




UID:585831
注册:2007-7-11
最后登录: 2008-10-16
帖子:231
精华:0

可用积分:237 (白手起家)
信誉积分:105
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2008-7-1 09:32 
我是用宏定义debug的办法写log,看log比较直观,你说assert这么好,那我也去试一下



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
coding3125 (Stainbow)
侠客



UID:339155
注册:2005-11-20
最后登录: 2008-09-21
帖子:49
精华:0

可用积分:548 (稍有积蓄)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2008-7-1 10:17 
个人感觉:

断言,在代码中对问题逻辑尽可能多的描述,这样,有些错误发生后,这些逻辑群本身就出现问题,不和谐,因而可以比较容易的调试。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

面包会有的
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
shan_ghost
精灵




UID:527235
注册:2007-2-8
最后登录: 2008-10-11
帖子:188
精华:0

可用积分:219 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2008-7-1 10:43 



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
@sky   帅哥
光明使者
it中拼命的那个


CU奥运火炬传递手2008
UID:676285
注册:2008-3-14
最后登录: 2008-10-16
帖子:767
精华:1

可用积分:776 (稍有积蓄)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2008-7-1 11:20 
不用,断言错了程序也挂了,基本不用



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

如果祖国需要我, 我会毫不犹豫的站出来

西藏永远属于中国
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
benjiam (xxxx)
天使




UID:59508
注册:2003-5-27
最后登录: 2008-10-09
帖子:1468
精华:0

可用积分:1289 (家境小康)
信誉积分:105
专家积分:20 (本版:20)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


8楼 发表于 2008-7-1 11:24 
假设你现在正在面试,主考不紧不慢地给出下一道题目:“请用C语言写一个类似strcpy的函数。
正在装载数据……
要考虑可能发生的异常情况。” 你会怎么做呢?很明显,对方不是在考察你的编程能力,因为复制字符串实在太容易了。对方是在考察你的编程风格(习惯),或者说,要看看你编码的质量。

    下面是多种可能的做法:

    void
    string_copy1(char* dest, const char* source)
    {
      assert(dest != NULL); /* 使用断言 */
      assert(source != NULL);
     
      while (*source != '\0') {
        *dest = *source;
        ++dest;
        ++source;
      }

      *dest = '\0';
    }

    void
    string_copy2(char* dest, const char* source)
    {
      if (dest != NULL && source != NULL) {  /* 对错误消极静默 */
        while (*source != '\0') {
          *dest = *source;
          ++dest;
          ++source;
        }

        *dest = '\0';
      }
    }

    int
    string_copy3(char* dest, const char* source)
    {
      if (dest != NULL && source != NULL) {
        while (*source != '\0') {
          *dest = *source;
          ++dest;
          ++source;
        }

        *dest = '\0';
        return SUCCESS;  /* 返回表示正确的值 */
      }                        
      else {
       errno = E_INVALIDARG;  /* 设定错误号 */
       return FAILED;         /*  返回表示错误的值 */
      }
    }
   
    // C++
    void
    string_copy4(char* dest, const char* source)
    {
       if (dest == NULL || source == NULL)
         throw Invalid_Argument_Error();  /*  抛出异常 */

       while (*source != '\0') {
         *dest = *source;
         ++dest;
         ++source;
       }

       *dest = '\0';
    }

我会选 3 、4

1 2 就出局

3是c 的做法 4是c++的做法



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Godbach (To be 千里马!)
精灵使


CU奥运火炬传递手2008
UID:534931
注册:2007-3-9
最后登录: 2008-10-16
帖子:4368
精华:4

可用积分:11142 (大富大贵)
信誉积分:105
专家积分:69 (本版:1)
空间积分:2
推广积分:0

状态:...在线...

[个人空间] [短信] [博客]


9楼 发表于 2008-7-1 11:44 
很少用。基本上自己去检查相应的错误。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

明犯我强汉天威者,穷搜天下,万里追杀,覆其巢,断其苗裔,戮其身,追其魂,屠其魄,虽远必诛!
----------------------------------
一尺之槌,日取其半,万世不竭!
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
Strange
骑士




UID:367910
注册:2006-1-28
最后登录: 2008-09-25
帖子:80
精华:0

可用积分:78 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2008-7-1 13:55 


QUOTE:
原帖由 benjiam 于 2008-7-1 11:24 发表
假设你现在正在面试,主考不紧不慢地给出下一道题目:“请用C语言写一个类似strcpy的函数。
正在装载数据……
要考虑可能发生的异常情况。” 你会怎么做呢?很明显,对方不是在考察你的编程能力,因为复制字符 ...

这个例子觉得不是很恰当,因为在这个情况下,的确不应该用断言

我的理解是
断言用在绝对不可能发生的情况下,或者说一旦发生,就需要停止程序进行检查的情况下,而不是用在错误处理上
主要按照业务逻辑来判断

上面举的strcpy为例,strcpy底层函数,默认应该具有返回strcpy成功与否的逻辑
并且也应该可以接受任何参数,但是需要判断的逻辑
所以这题考的并不是assert的使用,是考察strcpy所应该处理的问题
当然不可以用assert,因为NULL也是一个合法参数,按照规定参数等于NULL就不处理,返回strcpy失败

又比如,现在有1~5 5种东西,1、2、3是可以吃的,4、5是不可吃的
现在写一个函数 “吃”
int eat(int id)
{
  // 问题只考虑5种东西,如果不在这个范围内,就是不合法的
  // 所以用断言
  assert( 1 <= id && id <= 5);
  // 这个才是错误处理,全是合法参数的情况下,4~5是不可以吃的
  if ( 4 <= id ) return CANT_EAT;
  
  ... ...
}
当然,用if判断不在1~5之间也不是不可以,确实是判断了
这些就是各人对程序的理解,和程序实际需求之间的调整了

[ 本帖最后由 Strange 于 2008-7-1 13:56 编辑 ]



您对本贴的看法:鲜花[1] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?

首页 » 论坛 » C/C++ »


 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

Processed in 0.168411 second(s), 8 queries , Gzip enabled