一个困扰我几个月的C++问题.没难度,抉择问题

linger1216 2010-12-14 03:52:50
我承认有点标题党...嘿嘿

我们写程序的时候,经常有如下情形

class A
{
...
};

void foo(const A* p)
{
// 这里有几种写法

// 1:只写断言的情况
assert(NULL!=p);

// 2:写if的情况
if(NULL!=p) return;

// 3:写断言,又写if
assert(NULL!=p);
if(NULL!=p) return;
}

我经常使用3的写法,一直觉得挺乐呵的.后来看了imperfect c++,对于这种写法的嗤之以鼻.对于大师我还没到怀疑的地步,
所以一直在想,让程序不崩溃这种方式不好嘛?
我一直在嵌入式下面编程,有时候路测的时候,出现了崩溃,很是麻烦,而且打击测试信心.所以我没有进行变动我的风格.

但前一阵子,无意中在一本书上看到了.类似一句话(好像是**小工到专家这本书里面的)

crash early
死程序的危害,通常没有比有问题的程序要小得多.

这个问题又摆在我面前了,仔细思考了下,我觉得我真错了,但我最后还要问一句:"就这样对于参数不加判定,release下进行裸跑,难道更安全?"

如果这种环境下需要if语句?应该在什么场合下用呢?




...全文
130 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
linger1216 2010-12-15
  • 打赏
  • 举报
回复
"有意义"这个词让我醍醐灌顶.

以往写代码,总是不crash为主要目的,所以if写的有点多了.

OK.谢谢大家伙
就想叫yoko 2010-12-14
  • 打赏
  • 举报
回复
跟昨天的帖子一样啊
assert是debug下才有用,所以是你认为在发布之后不可能传进来NULL才用这个
另外还有if和异常两种方法
个人是只会用if了
a8881516 2010-12-14
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
必须满足的情况(不满足就是程序错误)用ASSERT
可以满足也可以不满足的情况用IF
cranium 2010-12-14
  • 打赏
  • 举报
回复
贴错了(copy的)

// 一、NULL是不合理的存在
void fun(int* p)
{
assert(p!=NULL);

//do work
p->work();
}
cranium 2010-12-14
  • 打赏
  • 举报
回复
两个模拟情况:

一、NULL是不合理的存在

void fun(int* p)
{
assert 就不该使用了

//do work
p->work();
}


二、NULL是合理的存在

void fun(int* p)
{
//assert 就不该使用了
if(p!=NULL)
{
//do work
p->work();
}
else
{
//other things to do
}
}
cranium 2010-12-14
  • 打赏
  • 举报
回复
对于三种情况我也是倾向于最后一种,不过细想还是有值得怀疑的地方。

assert断言是要求这个条件一定成立,只DEBUG有效,方便程序的调试等。
而if判断才是真正有意义的,如果不成立就不做工作了。

也就是说如果一个地方assert了,如assert(p!=NULL),就代表不论任何情况下p都不应该是一个NULL值,如果出现了NULL值绝对是个错误,对p而言NULL不是可能的值。所以这个时候不应该使用if(p!=NULL)这样的语句,因为这根本没任何意义。
ouyh12345 2010-12-14
  • 打赏
  • 举报
回复
得看具体的应用
说实话,早期的崩溃对整个项目是有好处的,可以提醒调用者,不能随便使用指针
linger1216 2010-12-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ouyh12345 的回复:]

例如很多windows api的做法,先传一个NULL参数,返回具体的大小
[/Quote]

这个我知道.得到什么什么的大小的情况.

但比如是p->invokestn()的情况,就只assert吗?
ouyh12345 2010-12-14
  • 打赏
  • 举报
回复
例如很多windows api的做法,先传一个NULL参数,返回具体的大小
ouyh12345 2010-12-14
  • 打赏
  • 举报
回复
有时候,传NULL参数是可以的,这时需要判断是否为NULL

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧