搜索

DSP编程技巧之7---揭开编译器神秘面纱之预处理与诊断

gecimao 发表于 2019-06-03 21:53 | 查看: | 回复:

  时,代码分析工具可以方便我们对代码进行分析,例如我们把鼠标指向一个函数名的时候,所指的地方就能出来一个实时菜单,使得我们可以直接定位到函数的声明、被调用的位置或者某个宏定义等等,非常方便。这种功能是如何实现的呢?在编译器的前端是一个语义parser(也有的地方叫分析器)就可以解析这些token,并产生树状表,供还可以完成一部分的语法错误检查功能。如果希望了解关于解析器的更详细的信息,可以参考编译原理方面最著名的“龙书”,即《Compliers:Principles,Techniques,在K&RC语言文档的A12这一节中也对解析器的预处理功能进行了详细的叙述,它预处理的信息主要包括:

  2.#include引用的文件,包括和“”两种方法引用的头文件;

  我们可以控制编译器的预处理选项,使得解析器根据我们的需求产生需要的预处理结果,方便我们对程序的开发调试;这些选项如表1所示。

  只执行预处理操作,并不输出预处理的解析结果,但是会并产生供make程序使用的列表文件,其中包含了被预处理的程序中存在的与头文件中的定义关联的行信息。

  make程序是编译器在编译时调用的编译程序。如果使用命令行的方法,可以不使用CCS而直接调用make程序进行编译。

  只执行预处理操作,但是会把包含#include指令的文件列表写入列表文件。

  只执行预处理操作,会生成其中包含了预定义的和用户自定义的宏的多个文件,这些文件和被预处理的文件的名字一样,只是其扩展名为.pp。

  预定义的宏是TI预定义的,它在预处理结果中被用/*Predefined*/标注出。

  只执行预处理操作,并把解析的结果输出为名字与输入文件名一致、扩展名为.pp的文件。

  在这种模式下,#include文件中的信息会被复制到.pp文件中,宏定义和其它的一些预处理指令信息都会被完全展开。

  只执行预处理操作,并把解析的结果输出为名字与输入文件名一致、扩展名为.pp的文件;与-ppo相比,输出的文件中保留了输入程序中的注释信息。

  在执行预处理之后,继续编译工作。对比可以看出,在预处理选项中,除了-ppa之外,其余的几个选项只完成预处理功能,并不进行接下来的编译工作。-ppa选项可以和其它的预处理选项一起使用,这样既可以输出预处理结果,又可以在预处理完成之后继续编译工作。

  只执行预处理操作,并把包含行控制信息(#line指令)的解析结果输出为名字与输入文件名一致、扩展名为.pp的文件。

  因为预处理器要使用到文件中的符号信息,所以相关的预定义信息一定要提供给预处理器,否则找不到符号信息就要报错了。符号选项比较简单,就是预定义与解除定义,如表2所示。

  在程序的处理过程中,我们可以控制编译器输出诊断信息选项,使得它输出我们期望的详细信息,更加容易定位和解决一些看起来难以捉摸的问题;这些选项如表3所示。需要注意的是,诊断信息相关的选项必须放在链接器选项--run_linker之前。

  在信息窗口中打印出编译器的版本号。这个用处不太大,因为从CCS的help的“关于”里面很容易看到。

  这里的num是诊断信息的标识符。不显示标识符的话,在编译出现错误时,会提示:

  把警告信息作为错误处理。在这样的严格的模式下,必须消除所有的警告和错误,编译才能继续。

  不显示警告信息,但是错误信息还是会提示的:毕竟有错误在的话编译无法完成。

  这个选项设置编译过程中错误的上限,比如有10个源程序,设定错误上限为5,假如第3个文件时就已经有5个错误了,那么编译器就停止了编译,不再继续编译剩下的文件了。

  “超级安静”模式。与-q相比,多了个q,足以看出它的级别。显然它的处理速度最快,但是给出的诊断信息那是一个也没有:最多告诉你程序有x个错误。如果确信程序完全无误,用这个选项编译倒是要快了不少。

本文链接:http://jonnutting.com/dongtaishengchengchengxu/544.html
随机为您推荐歌词

联系我们 | 关于我们 | 网友投稿 | 版权声明 | 广告服务 | 站点统计 | 网站地图

版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright @ 2012-2013 织梦猫 版权所有  Powered by Dedecms 5.7
渝ICP备10013703号  

回顶部