摘要:编译器是将程序语言编译成机器语言的一种高级程序。如今许多编译器越发智能,在编译不通过的情况,你的代码甚至都无法运行,那么到底是编译的问题还是您的代码问题呢?
许多程序员喜欢抱怨编译器报出的各做错误,难道真的是编译器问题吗?下面就让我们来谈谈吧!
你确定吗?
当程序员告诉你,编译器会产生错误,请问你会信吗?99%的情况下,你会把它当作一个谎言或者是笑话,甚至在内心会嘲笑这个程序员。
通常编译报的错主要有以下几种:
- 数组溢出
- 变量没有初始化
- 输出错误
- 同步错误
- 非法使用变量
- 调用未定义方法或其它
- 等等
对编译器报出的这些错误你是否早已如数家珍,但这并没有阻止程序员一次次对编译器的指责与抱怨。似乎这一切都是编译器的错!
编译器也可能包含错误,但是这种机率真的很小,除非你使用一些稀奇古怪的编译器。在我多年使用Visual C++的职业生涯中,我只看到一次汇编代码生成错误。
建议
当你在开始抱怨前,首先检查一下自己的代码是否有错并且已更正,其次,最好看看别的程序员是如何评价这个错误的。
目的
先奉上一段编译代码供大家娱乐一下:
- TprintPrefs::TprintPrefs(IffdshowBase*Ideci,
- constTfontSettings*IfontSettings)
- {
- memset(this,0,sizeof(this));//Thisdoesn'tseemto
- //helpafteroptimization.
-
dx=dy=0;
-
isOSD=false;
-
xpos=ypos=0;
-
align=0;
-
linespacing=0;
-
sizeDx=0;
-
sizeDy=0;
- ...
- }
我可以想象程序员看到这段注释会有多愤怒,多令人讨厌的编译器!在调试版本阶段,所有变量都被赋0值。由于优化问题,在发布版本中会包含一些垃圾。面对这种情况,最好的解决之道便是检查代码,而作为程序员,你还需继续编写代码,用勇气战胜邪恶!
下面让我们来分析上面这段代码,你发现没?memset()函数不工作的原因仅仅是因为一个非常简单的错误:第三个参数是计算指针的大小而不是计算结果的尺寸。正确的调用应该是:“memset(this,0,sizeof(*this));”
顺便说一句,函数memcpy()函数的效率也非常低。我确信,程序员肯定会说编译器开发商真迂腐。
- voidAssign(constAVSValue*src,boolinit){
-
if(src->IsClip()&&src->clip)
-
src->clip->AddRef();
- if(!init&&IsClip()&&clip)
-
clip->Release();
- //makesurethiscopiesthewholestruct!
- //((__int32*)this)[0]=((__int32*)src)[0];
- //((__int32*)this)[1]=((__int32*)src)[1];
- memcpy(this,src,sizeof(this));
- }
从注释中可以明白这段代码试图从其他方法中拷贝内存。然而,编写这段代码的程序员试图丢弃使用memcpy()方法。当程序员想要复制的结构体正好是8字节的时候,在64位系统里面正好可以运行。
通过上面的分析大家可以明白,抱怨与指责编译器(制造商)是无法解决任何问题的,只会浪费时间,无法静下心继续编写代码。还是好好
检查一下你们自己的代码吧!此外,工具是死的,人是活的,程序员们,你们才是
工具的主人!
分享到:
相关推荐
VB6.exe可以将cls模块、普通模块、窗体代码frm先生存汇编代码文件,然后再继续编译,但我们看不到这些代码,是因为编译器C2.exe隐藏或删除了,为了在VB6的程序里可以嵌入汇编代码或C代码,就要让C2.exe将这些汇编...
VB6.exe可以将cls模块、普通模块、窗体代码frm先生存汇编代码文件,然后再继续编译,但我们看不到这些代码,是因为编译器C2.exe隐藏或删除了,为了在VB6的程序里可以嵌入汇编代码或C代码,就要让C2.exe将这些汇编...
自制编译器2
C语言编译器源代码.rar C语言编译器源代码.rar
c++代码贪吃蛇游戏直接复制到vc6.0编译器即可.docx
用代码缓存复用技术提升Android即时编译器效率.pdf
C++语言编写的小型编译器,包括词法分析、语法分析、以及运行
C代码贪吃蛇游戏直接复制到VC6.0编译器即可.pdf
GCC编译器的源代码GCC编译器的源代码GCC编译器的源代码GCC编译器的源代码GCC编译器的源代码GCC编译器的源代码GCC编译器的源代码
JAVA反编译器jshrink.exe ,可以有效的反编译出class源代码
java编译器源代码.rar
UnderCV_C++编译器源代码.rar
他并不像Java一样通过代码编译器和解释器混合模式将代码字节化运行,所以JavaScript本身在浏览器中就是边解释边运行的。那么为什么还需要babel语法编译器? babel是一门静态语法编译器,他并不是在程序运行时参与...
编译器 前端示例代码java版,编译器 前端示例代码java版编译器 前端示例代码java版编译器 前端示例代码java版
kaleidoscope, Haskell LLVM编译器教程 用LLVM构建小型编程语言的简短指南。 作者声明: 。 Haskell 联机阅读:的HTMLPDF源代码压缩代码设置你需要 GHC 7.8或者更高版本以及 LLVM 4.0. 有关在你的选择平台上安装L
编译工具.....................................................................................................................................4 1.C 语言对应的编译器——VS2008..............................
VCpp编译器源代码UnderC 这个是一个C++编译器源代码UnderC C++开源的编译器很少有这么精简的.代码通熟易懂.呵呵.
适合需要反编译C51可执行程序(bin文件或Hex文件)为汇编代码的人群。
Java编译辅助工具,能方便实时修改Java源代码并编译、保存Java源文件,操作方便,省去了反复输入编译命令的麻烦。熊熊Java编译器是免费的绿色软件,欢迎使用。 熊熊Java编译器 v1.07 What's new: =========...