ZHCUAV7Z september 1995 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
只有类对象的宏才会转换为汇编指令。类函数的宏没有汇编表示,因此无法转换。预定义和内置 C/C++ 宏不会转换为汇编指令(即 __FILE__、__TIME__、__TI_COMPILER_VERSION__ 等)。例如,这段代码会转换为汇编指令,因为它是一个类对象的宏:
#define NAME Charley
这段代码不会转换为汇编指令,因为它是类函数的宏:
#define MAX(x,y) (x>y ? x : y)
某些宏虽会进行转换,但在包含的汇编文件中没有任何功能用途。例如,以下结果会将汇编替换符号 FOREVER 设置为值 while(1),但这在汇编指令中不起任何作用,因为 while(1) 不是合法的汇编代码。
#define FOREVER while(1)
宏不会按照转换的方式进行解释。例如,以下代码会将汇编器替代符号 OFFSET 设置为文字字符串值 5+12,而非值 17。发生这种情况的原因是 C/C++ 语言的语义要求宏在相关上下文中进行计算,而不是在解析时进行计算。
#define OFFSET 5+12
因为 C/C++ 中的宏是在它们的使用上下文中进行计算的,所以 C/C++ printf 转义序列(如 \n)不会在转换后的汇编宏中转换为单个字符。有关如何使用 C/C++ 宏字符串的建议,请参阅节 13.2.11。
宏使用 .define 指令(参阅节 13.4.2)进行转换,其功能类似于 .asg 汇编器指令。例外情况是 .define 不允许重新定义寄存器符号和助记符,以防止转换破坏基本汇编环境。若要从汇编范围中删除宏,可以在定义它的 .cdecls 之后使用 .undef(参阅节 13.4.3)。
#(字符串化运算符)的宏功能仅在功能宏中有用。此过程不支持功能宏,因此也不支持 #。串联运算符 ## 仅在功能上下文中起作用,但可以退化地用于串联两个字符串,因此它在该上下文中受支持。