ZHCU947E June 2015 – January 2023
链接器使用标准 C 预处理器来预处理链接器命令文件。因此,命令文件可以包含众所周知的预处理指令,例如 #define、#include 和 #if / #endif。
三个链接器选项控制着预处理器:
--disable_pp | 禁用命令文件预处理 |
--define=name[=val] | 将 name 预定义为预处理器宏 |
--undefine=name | 删除宏 name |
编译器具有含义相同的 --define 和 --undefine 选项。但是,链接器选项不同;只有在 --run_linker 之后指定的 --define 和 --undefine 选项会传递给链接器。例如:
cl6x --define=FOO=1 main.c --run_linker --define=BAR=2 lnk.cmd
链接器只能看到 BAR 的 --define;编译器只能看到 FOO 的 --define。
当一个命令文件包含 (#include) 另一个命令文件时,预处理上下文以常规方式从父级传递到子级(即,在父级定义的宏在子级中可见)。但是,当不是通过 #include 来调用命令文件时,无论是在命令行中还是通过在另一个命令文件中进行指定的常规方式,预处理上下文都不会传递到嵌套的文件中。 例外情况是 --define 和 --undefine 选项,这些选项是从遇到的位置开始全局应用。例如:
--define GLOBAL
#define LOCAL
#include "incfile.cmd" /*看到 GLOBAL 和 LOCAL */
nestfile.cmd /* 仅看到 GLOBAL */
在命令文件中使用 --define 和 --undefine 时有两点注意事项。首先,它们具有如上所述的全局影响。其次,它们本身实际上并不是预处理指令,因此它们会被宏替换,进而可能会产生意想不到的后果。为了消除这种影响,可以在符号名称外添加引号。例如:
--define MYSYM=123
--undefine MYSYM /* 扩展到 --undefine 123 (!)*/
--undefine "MYSYM" /* 啊,这样更好 */
链接器按照以下顺序搜索 #include 文件,直到找到该文件:
有两个例外:相对路径名(如“../name”)总是相对于当前目录进行搜索;绝对路径名(例如“/usr/tools/name”)完全绕过搜索路径。
链接器提供了#GUID-BA59EA1B-5D52-4730-97C9-A48835E5AB20/IDMACNAME 中列出的内置宏定义。链接器中这些宏的可用性取决于所使用的命令行选项,而不是所链接文件的构建属性。如果这些宏未按预期设置,请确认工程命令行使用了正确的编译器选项设置。
宏名称 | 说明 |
---|---|
__DATE__ | 扩展到 mmm dd yyyy 形式的编译日期 |
__FILE__ | 扩展到当前源文件名 |
__TI_COMPILER_VERSION__ | 已定义为 7-9 位整数,具体取决于 X 是 1、2 还是 3 位。该数字不包含小数。例如,版本 3.2.1 表示为 3002001。去掉前导零以防止数字被解释为八进制。 |
__TI_EABI__ | 如果启用了 EABI,则已定义为 1;否则未定义。 |
__TIME__ | 扩展到“hh:mm:ss”形式的编译时间 |
__TMS320C6X__ | 始终已定义 |
__TMS320C6600__ | 如果 --silicon_version=6600,则已定义为 1;否则未定义。 |
__TMS320C6740__ | 如果 --silicon_version=6740,则已定义为 1;否则未定义。 |
__TMS320C64_PLUS__ | 如果 --silicon_version=6400+,则已定义为 1;否则未定义。 |
__TMS320C6400_PLUS__ | 如果 --silicon_version=6400+,则已定义为 1;否则未定义;__TMS320C64_PLUS__ 的替代宏 |