在编程软件例如CCS中编程时,代码剖析东西能够便利咱们对代码进行剖析,例如咱们把鼠标指向一个函数名的时分,所指的当地就能出来一个实时菜单,使得咱们能够直接定位到函数的声明、被调用的方位或许某个宏界说等等,十分便利。这种功用是怎么完结的呢?在编译器的前端是一个语义解析器,它担任把源程序中的token找出来,然后解析器parser(也有的当地叫剖析器)就能够解析这些token,并发生树状表,供编程环境运用;此外解析器还能够完结一部分的语法过错查看功用。假设希望了解关于解析器的更具体的信息,能够参阅编译原理方面最著名的“龙书”,即《Compliers: Principles, Techniques, &Tools》;在K&RC言语文档的A12这一节中也对解析器的预处理功用进行了具体的叙说,它预处理的信息首要包括:
1. 宏界说和扩展,例如_INLINE;
2. #include引证的文件,包括<>和“”两种办法引证的头文件;
3. 条件编译指令,例如#if,#endif等等;
4. 其它的多种预处理指令,首要是#最初的一些指令,例如#error。
咱们能够操控编译器的预处理选项,使得解析器依据咱们的需求发生需求的预处理成果,便利咱们对程序的开发调试;这些选项如表1所示。
表1 编译器中解析器的预处理选项
预处理选项 |
别号 |
操控作用 |
–preproc_dependency[=filename |
-ppd |
只履行预处理操作,并不输出预处理的解析成果,可是会并发生供make程序运用的列表文件,其间包括了被预处理的程序中存在的与头文件中的界说相关的行信息。 make程序是编译器在编译时调用的编译程序。假设运用命令行的办法,能够不运用CCS而直接调用make程序进行编译。 |
–preproc_includes[=filename] |
-ppi |
只履行预处理操作,可是会把包括#include指令的文件列表写入列表文件。 |
–preproc_macros[=filename] |
-ppm |
只履行预处理操作,会生成其间包括了预界说的和用户自界说的宏的多个文件,这些文件和被预处理的文件的姓名相同,仅仅其扩展名为.pp。 预界说的宏是TI预界说的,它在预处理成果中被用/* Predefined */标示出。 |
–preproc_only |
-ppo |
只履行预处理操作,并把解析的成果输出为姓名与输入文件名共同、扩展名为.pp的文件。 在这种形式下,#include文件中的信息会被复制到.pp文件中,宏界说和其它的一些预处理指令信息都会被彻底打开。 |
–preproc_with_comment |
-ppc |
只履行预处理操作,并把解析的成果输出为姓名与输入文件名共同、扩展名为.pp的文件;与-ppo比较,输出的文件中保留了输入程序中的注释信息。 |
–preproc_with_compile |
-ppa |
在履行预处理之后,持续编译作业。比照能够看出,在预处理选项中,除了-ppa之外,其他的几个选项只完结预处理功用,并不进行接下来的编译作业。-ppa选项能够和其它的预处理选项一同运用,这样既能够输出预处理成果,又能够在预处理完结之后持续编译作业。 |
–preproc_with_line |
-ppl |
只履行预处理操作,并把包括行操控信息(#line指令)的解析成果输出为姓名与输入文件名共同、扩展名为.pp的文件。 |
由于预处理器要运用到文件中的符号信息,所以相关的预界说信息一定要提供给预处理器,不然找不到符号信息就要报错了。符号选项比较简单,便是预界说与免除界说,如表2所示。
表2 预界说的符号选项
言语选项 |
别号 |
操控作用 |
–define=name[=def] |
-D |
预界说符号,运用办法是–define=name="\"string def\""。在编译器选项里运用-D,与在C程序里运用#define的作用是相同的。 |
–undefine=name |
-U |
免除对某个符号的界说,它会掩盖-D选项的作用。 |
在程序的处理过程中,咱们能够操控编译器输出确诊信息选项,使得它输出咱们希望的具体信息,愈加简单定位和处理一些看起来难以捉摸的问题;这些选项如表3所示。需求留意的是,确诊信息相关的选项有必要放在链接器选项–run_linker之前。
表3编译器的确诊信息选项
言语选项 |
别号 |
操控作用 |
–compiler_revision |
|
在信息窗口中打印出编译器的版别号。这个用途不太大,由于从CCS的help的“关于”里边很简单看到。 |
–diag_error=num |
-pdse |
这儿的num是确诊信息的标识符。不显现标识符的话,在编译呈现过错时,会提示: error: a break statement may only be used within a loop or switch 启用的话,在有过错的时分,会提示: error #77: this declaration has no storage class or type specifier xxxxx; -pdse是把标识符num对应的句子标记为过错。 |
–diag_remark=num |
-pdsr |
把标识符num对应的句子标记为提示。 |
–diag_suppress=num |
-pds |
把标识符num对应的句子标记为不提示。 |
–diag_warning=num |
-pdsw |
把标识符num对应的句子标记为正告。 |
–diag_wrap={on|off} |
|
默以为on,打包确诊信息。 |
–display_error_number |
-pden |
把确诊信息标识符和它对应的文本阐明一同显现出来。 |
–emit_warnings_as_errors |
-pdew |
把正告信息作为过错处理。在这样的严厉的形式下,有必要消除一切的正告和过错,编译才干持续。 |
–issue_remarks |
-pdr |
提示一切的提示信息(即非严峻的正告信息)。 |
–no_warnings |
-pdw |
不显现正告信息,可是过错信息仍是会提示的:究竟有过错在的话编译无法完结。 |
–quiet |
-q |
安静形式,不显现编译过程中的确诊信息。 |
–set_error_limit=num |
-pdel |
这个选项设置编译过程中过错的上限,比方有10个源程序,设定过错上限为5,假设第3个文件时就已经有5个过错了,那么编译器就中止了编译,不再持续编译剩余的文件了。 |
–super_quiet |
-qq |
“超级安静”形式。与-q比较,多了个q,足以看出它的等级。明显它的处理速度最快,可是给出的确诊信息那是一个也没有:最多告知你程序有x个过错。假设坚信程序彻底无误,用这个选项编译却是要快了不少。 |
–tool_version |
-version |
显现编译过程中调用的各个东西的版别信息。 |
–verbose |
|
烦琐形式:显现函数编译过程中的处理信息。 |
–verbose_diagnostics |
-pdv |
在烦琐形式的基础上,把源程序中的对应部分也显现出来。 |
–write_diagnostics_file |
-pdf |
发生确诊信息文件。 |