`
xpp02
  • 浏览: 1014234 次
社区版块
存档分类
最新评论

编译器vs.代码 谁之过

 
阅读更多
摘要:编译器是将程序语言编译成机器语言的一种高级程序。如今许多编译器越发智能,在编译不通过的情况,你的代码甚至都无法运行,那么到底是编译的问题还是您的代码问题呢?

许多程序员喜欢抱怨编译器报出的各做错误,难道真的是编译器问题吗?下面就让我们来谈谈吧!

你确定吗?

当程序员告诉你,编译器会产生错误,请问你会信吗?99%的情况下,你会把它当作一个谎言或者是笑话,甚至在内心会嘲笑这个程序员。

通常编译报的错主要有以下几种:

  • 数组溢出
  • 变量没有初始化
  • 输出错误
  • 同步错误
  • 非法使用变量
  • 调用未定义方法或其它
  • 等等

对编译器报出的这些错误你是否早已如数家珍,但这并没有阻止程序员一次次对编译器的指责与抱怨。似乎这一切都是编译器的错!

编译器也可能包含错误,但是这种机率真的很小,除非你使用一些稀奇古怪的编译器。在我多年使用Visual C++的职业生涯中,我只看到一次汇编代码生成错误。

建议

当你在开始抱怨前,首先检查一下自己的代码是否有错并且已更正,其次,最好看看别的程序员是如何评价这个错误的。

目的

先奉上一段编译代码供大家娱乐一下:

  1. TprintPrefs::TprintPrefs(IffdshowBase*Ideci,
  2. constTfontSettings*IfontSettings)
  3. {
  4. memset(this,0,sizeof(this));//Thisdoesn'tseemto
  5. //helpafteroptimization.
  6. dx=dy=0;
  7. isOSD=false;
  8. xpos=ypos=0;
  9. align=0;
  10. linespacing=0;
  11. sizeDx=0;
  12. sizeDy=0;
  13. ...
  14. }

我可以想象程序员看到这段注释会有多愤怒,多令人讨厌的编译器!在调试版本阶段,所有变量都被赋0值。由于优化问题,在发布版本中会包含一些垃圾。面对这种情况,最好的解决之道便是检查代码,而作为程序员,你还需继续编写代码,用勇气战胜邪恶!

下面让我们来分析上面这段代码,你发现没?memset()函数不工作的原因仅仅是因为一个非常简单的错误:第三个参数是计算指针的大小而不是计算结果的尺寸。正确的调用应该是:“memset(this,0,sizeof(*this));”

顺便说一句,函数memcpy()函数的效率也非常低。我确信,程序员肯定会说编译器开发商真迂腐。

  1. voidAssign(constAVSValue*src,boolinit){
  2. if(src->IsClip()&&src->clip)
  3. src->clip->AddRef();
  4. if(!init&&IsClip()&&clip)
  5. clip->Release();
  6. //makesurethiscopiesthewholestruct!
  7. //((__int32*)this)[0]=((__int32*)src)[0];
  8. //((__int32*)this)[1]=((__int32*)src)[1];
  9. memcpy(this,src,sizeof(this));
  10. }

从注释中可以明白这段代码试图从其他方法中拷贝内存。然而,编写这段代码的程序员试图丢弃使用memcpy()方法。当程序员想要复制的结构体正好是8字节的时候,在64位系统里面正好可以运行。

通过上面的分析大家可以明白,抱怨与指责编译器(制造商)是无法解决任何问题的,只会浪费时间,无法静下心继续编写代码。还是好好检查一下你们自己的代码吧!此外,工具是死的,人是活的,程序员们,你们才是工具的主人
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics