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

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

你确定吗?

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

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

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

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

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

建议

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

目的

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

  1. TprintPrefs::TprintPrefs(IffdshowBase *Ideci,
  2. const TfontSettings *IfontSettings)
  3. {
  4. memset(this, 0, sizeof(this)); // This doesn't seem to
  5. // help after optimization.
  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. void Assign(const AVSValue* src, bool init) {
  2. if (src->IsClip() && src->clip)
  3. src->clip->AddRef();
  4. if (!init && IsClip() && clip)
  5. clip->Release();
  6. // make sure this copies the whole struct!
  7. //((__int32*)this)[0] = ((__int32*)src)[0];
  8. //((__int32*)this)[1] = ((__int32*)src)[1];
  9. memcpy(this,src,sizeof(this));
  10. }

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

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

编译器vs.代码 谁之过相关推荐

  1. 基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)

    基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#) 为了完美解析GLSL源码,获取其中的信息(都有哪些in/out/uniform等),我决定做个GLSL编译器的前端(以后简称编译器或 ...

  2. __declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码

    __declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码 extern "C" void __declspec(naked) ...

  3. 重磅:华为方舟编译器开源代码「正式发布」

    loonggg 读完需要 2 分钟 速读仅需1分钟 就在今天,8 月份的最后一天,华为方舟编译器开源官网正式上线了. 本次方舟编译器开源的是编译器框架部分源码,包括编译器中间表示(IR,Interme ...

  4. Linux C++性能优化秘籍:从编译器到代码,探究高性能C++程序的实现之道

    Linux C++性能优化秘籍:从编译器到代码,揭秘高性能C++程序的实现之道 引言 性能优化的重要性 Linux环境下C++程序的特点 高性能C++编程的核心要点 编译器优化 GCC与Clang编译 ...

  5. 类C编译器 C代码实现

    大三上学期做的一个小项目 类C编译器 源代码和测试文件地址https://github.com/zxt1995/ttbox.git 总体框架: 读入待编译文件->语义分析并转换为指令->按 ...

  6. java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...

    前言简介 前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译 ...

  7. 方舟编译器java代码_华为方舟编译器编译工具正式发布

    2019 华为全球开发者大会将在 8 月 9 日-11 日在华为松山湖基地召开.本次开发者大会邀请了 1500 位合作伙伴.5000 名全球开发者,将是华为历来规模最大的一次会议.在这次大会上,华为方 ...

  8. notpad++快捷的编写代码并调用编译器编译代码

    知识准备: 有cmd命令提示符使用经验或者简单的批处理bat脚本编写经验,如cd .del .echo 等简单命令 notpad++windows版在安装NPPEXEC插件之后,按f6可以编写脚本,下 ...

  9. 编译器中代码自动对齐快捷键

    在VS2008中,选定代码后,按Ctrl+K+F组合键,可以自动进行代码对齐. 注意:要先按下Ctrl和K,再按下F,因为Ctrl+F是查找的快捷键. 也可以先按下Ctrl+K,再按下Ctrl+F. ...

最新文章

  1. (10) 需求征集 -- 权限管理
  2. 我在网上抢火车票:多加了100元的加速包,却依然买不到票
  3. JAVA 创建学生类
  4. 使用PyCharm运行第一行python代码
  5. vscode php插件_vscode+phpstudy+xdebug无法断点(踩坑记)
  6. 函数 迭代器,生成器
  7. [4G5G专题-45]:物理层-基带子载波数字调制解调(星座图, 相位调制PSK, 正交幅度相位调制QAM)
  8. bootstraptable冻结列无效_Bootstrap Table 冻结列功能详解
  9. android 跳转公众号,app直接跳转公众号
  10. 托利多bcom电子秤常用设置
  11. SE93 创建参数事务
  12. RTX 4070TI和RTX 4090性能差距 RTX4070ti和4070区别对比
  13. 关系数据模型和SQL基础
  14. shell遍历多个数组
  15. 大流量卡介绍:网上的大流量卡都是怎么来的?
  16. Struts2 ValueStack ActionContext OGNL 关系
  17. 多个blockquote_无线电力BLOCKQUOTE目录
  18. c语言--贪吃蛇小游戏
  19. 2016车联网畅想:野心谁都有,把握生态才是王道
  20. 2022牛客寒假算法基础集训营5 K造梦小孩

热门文章

  1. 【转】1.5异步编程:.NET4.X 数据并行
  2. angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现
  3. Python 中如何解决 asyncio 文件描述符最大数量限制问题
  4. Python3 基础学习笔记 C08 【类】
  5. 阿里一面 —— 什么是多线程?
  6. Mac下使用brew的常用步骤
  7. JetBrains - IDEA 常用快捷键汇总
  8. 【ZOJ - 3210】A Stack or A Queue? (模拟)
  9. 动手学无人驾驶(2):车辆检测
  10. Linux中软件安装使用的命令是,Linux软件安装命令