ZHCU947E June 2015 – January 2023
.cdecls 指令允许程序员在混合汇编和 C/C++ 环境中共享 C 头文件,此头文件包含 C 和汇编代码间的声明和原型。任何合法的 C/C++ 都可以在 .cdecls 块中使用,C/C++ 声明将导致自动生成合适的汇编代码。这允许程序员在汇编代码中引用 C/C++ 结构;比如调用函数、分配空间、访问结构成员等;使用等效的汇编机制。虽然函数和变量定义会被忽略,但最常见的 C/C++ 元素被转换为汇编语言:枚举、(非函数类)宏、函数和变量原型、结构体和联合体。
有关 .cdecls 汇编器指令语法的详细信息,请参阅 .cdecls 指令说明。
.cdecls 指令可以出现在汇编源文件中的任何位置,并且可以在一个文件中多次出现。但是,一个 .cdecls 创建的 C/C++ 环境不会被后面的 .cdecls 继承;每个 .cdecls 实例的 C/C++ 环境都是全新的。
例如,以下代码会导致发出警告:
.cdecls C,NOLIST
%{
#define ASMTEST 1
%}
.cdecls C,NOLIST
%{
#ifndef ASMTEST
#warn "ASMTEST not defined!" /* will be issued */
#endif
%}
因此,.cdecls 块的典型用法是在汇编源文件的开头附近单一使用,该源文件中包含所有必要的 C/C++ 头文件。
用户可以使用编译器 --include_path=path 选项来指定汇编中所用头文件所需的额外包含文件路径,就像编译 C 文件时那样。
由 .cdecls 代码生成的任何 C/C++ 错误或警告会像适用于 C/C++ 源代码的错误或警告那样正常发出。C/C++ 错误会导致该指令失败,并且任何转换得到的汇编代码都不会包含在内。
函数类宏或变量定义等无法转换的 C/C++ 结构会导致向转换而来的汇编文件中输出注释。例如:
; ASM HEADER WARNING - variable definition 'ABCD' ignored
每条消息的开头都会显示前缀 ASM HEADER WARNING。若要查看警告,需要指定 WARN 参数,以便在 STDERR 中显示对应消息;或者需要指定 LIST 参数,以便在列表文件中显示警告(若有)。
最后,请注意,转换而来的汇编代码不会以与原有 C/C++ 源代码相同的顺序显示,并且 C/C++ 结构可能会在转换过程中简化为标准化形式,但这应该不会影响其最终使用。