DSP编程技巧之:控制与语言选项以及预处理与诊断
2015-09-18
在前面几期中,我们了解到DSP编程技巧之:编译流程与处理器选项、DSP编程技巧之:程序优化、DSP编程技巧之:调试与路径选项,今天为大家讲解控制与语言选项以及预处理与诊断。
编译器有一些控制选项,这些选项是供我们来控制编译器的,不像前几篇文章提到的那些选项那样,是编译器用来控制编译结果的。下面我们就来看看我们可以使用的控制编译器的选项有哪些:
就编译器本身来说,它只要读取C、C++、汇编等文件进行处理就完成任务了,所以编译器的控制选项并不多,一般情况下一个-z选项就足够我们完成从编译程序到生成目标的编译器控制效果了。相比较而言,C、C++这些语言本身就复杂的多了,并且因为有很多个版本的存在,难免有一些小混乱的存在,所以编译器里与编程语言本身相关的选项就显得特别多,以便我们来对语言的特性等进行正确使用,下面就看看编译器里与编程语言有关的选项:
从表2里也可以看出,大部分特性是与C++编程息息相关的,如果仅仅使用C进行一些编程的话,对编译器的编程语言选项的使用确实要简单了不少。
在编程软件例如CCS中编程时,代码分析工具可以方便我们对代码进行分析,例如我们把鼠标指向一个函数名的时候,所指的地方就能出来一个实时菜单,使得我们可以直接定位到函数的声明、被调用的位置或者某个宏定义等等,非常方便。这种功能是如何实现的呢?在编译器的前端是一个语义解析器,它负责把源程序中的token找出来,然后解析器parser(也有的地方叫分析器)就可以解析这些token,并产生树状表,供编程环境使用;此外解析器还可以完成一部分的语法错误检查功能。如果希望了解关于解析器的更详细的信息,可以参考编译原理方面最著名的“龙书”,即《Compliers: Principles, Techniques, &Tools》;在K&RC语言文档的A12这一节中也对解析器的预处理功能进行了详细的叙述,它预处理的信息主要包括:
1. 宏定义和扩展,例如_INLINE;
2. #include引用的文件,包括<>和“”两种方法引用的头文件;
3. 条件编译指令,例如#if,#endif等等;
4. 其它的多种预处理指令,主要是#开头的一些指令,例如#error。
我们可以控制编译器的预处理选项,使得解析器根据我们的需求产生需要的预处理结果,方便我们对程序的开发调试;这些选项如表1所示。
因为预处理器要使用到文件中的符号信息,所以相关的预定义信息一定要提供给预处理器,否则找不到符号信息就要报错了。符号选项比较简单,就是预定义与解除定义,如表2所示。
在程序的处理过程中,我们可以控制编译器输出诊断信息选项,使得它输出我们期望的详细信息,更加容易定位和解决一些看起来难以捉摸的问题;这些选项如表3所示。需要注意的是,诊断信息相关的选项必须放在链接器选项--run_linker之前。