许多程序员喜欢抱怨编译器报出的各做错误,难道真的是编译器问题吗?下面就让我们来谈谈吧!
你确定吗?
当程序员告诉你,编译器会产生错误,请问你会信吗?99%的情况下,你会把它当作一个谎言或者是笑话,甚至在内心会嘲笑这个程序员。
通常编译报的错主要有以下几种:
- 数组溢出
- 变量没有初始化
- 输出错误
- 同步错误
- 非法使用变量
- 调用未定义方法或其它
- 等等
对编译器报出的这些错误你是否早已如数家珍,但这并没有阻止程序员一次次对编译器的指责与抱怨。似乎这一切都是编译器的错!
编译器也可能包含错误,但是这种机率真的很小,除非你使用一些稀奇古怪的编译器。在我多年使用Visual C++的职业生涯中,我只看到一次汇编代码生成错误。
建议
当你在开始抱怨前,首先检查一下自己的代码是否有错并且已更正,其次,最好看看别的程序员是如何评价这个错误的。
目的
先奉上一段编译代码供大家娱乐一下:
- TprintPrefs::TprintPrefs(IffdshowBase *Ideci,
- const TfontSettings *IfontSettings)
- {
- memset(this, 0, sizeof(this)); // This doesn't seem to
- // help after optimization.
- dx = dy = 0;
- isOSD = false;
- xpos = ypos = 0;
- align = 0;
- linespacing = 0;
- sizeDx = 0;
- sizeDy = 0;
- ...
- }
我可以想象程序员看到这段注释会有多愤怒,多令人讨厌的编译器!在调试版本阶段,所有变量都被赋0值。由于优化问题,在发布版本中会包含一些垃圾。面对这种情况,最好的解决之道便是检查代码,而作为程序员,你还需继续编写代码,用勇气战胜邪恶!
下面让我们来分析上面这段代码,你发现没?memset()函数不工作的原因仅仅是因为一个非常简单的错误:第三个参数是计算指针的大小而不是计算结果的尺寸。正确的调用应该是:“memset(this,0,sizeof(*this));”
顺便说一句,函数memcpy()函数的效率也非常低。我确信,程序员肯定会说编译器开发商真迂腐。
- void Assign(const AVSValue* src, bool init) {
- if (src->IsClip() && src->clip)
- src->clip->AddRef();
- if (!init && IsClip() && clip)
- clip->Release();
- // make sure this copies the whole struct!
- //((__int32*)this)[0] = ((__int32*)src)[0];
- //((__int32*)this)[1] = ((__int32*)src)[1];
- memcpy(this,src,sizeof(this));
- }
从注释中可以明白这段代码试图从其他方法中拷贝内存。然而,编写这段代码的程序员试图丢弃使用memcpy()方法。当程序员想要复制的结构体正好是8字节的时候,在64位系统里面正好可以运行。
通过上面的分析大家可以明白,抱怨与指责编译器(制造商)是无法解决任何问题的,只会浪费时间,无法静下心继续编写代码。还是好好 检查一下你们自己的代码吧!此外,工具是死的,人是活的,程序员们,你们才是 工具的主人!