前页 | 后页 |
语言宏
在对 C++ 等语言进行逆向工程时,您可能会发现预处理器指令分散在整个代码中。这可以使代码管理更容易,但会妨碍底层 C++ 语言的解析。
为了帮助解决这个问题,您可以包含任意数量的宏定义,这些宏定义在相工程的解析阶段会被忽略。如果您有此功能,最好先使用适当的编译器预处理代码;这样,复杂的宏定义和定义被扩展并且可以很容易地解析。如果你没有这个功能,那么这个选项提供了一个方便的替代品。
访问
功能区 |
设置 >参考> 设置 > 预处理器宏或 开发>源代码>选项>配置>定义预处理器宏 |
定义一个宏
节 |
行动 |
也见 |
---|---|---|
1 |
选择“预处理器宏”菜单选项。 将显示“语言宏”对话框。 |
|
2 |
点击加新按钮。 |
|
3 |
输入宏的详细信息。 |
|
4 |
点击确定按钮。 |
嵌入在声明中的宏
宏有时在类和操作的声明中使用,如下例所示:
类 __declspec Foo
{
int __declspec Bar( int p);
};
如果 declspec 定义为 C++ 宏,如前所述,导入的类和操作包含一个名为 DeclMacro1 的标记值,其值为 __declspec(后续宏将定义为 DeclMacro2、DeclMacro3 等)。
在正向工程期间,这些标记值用于重新生成代码中的宏。
定义复杂宏
有时为可以跨越多行的复杂宏定义规则很有用; Enterprise Architect忽略规则定义的整个代码段。
可以在Enterprise Architect中定义此类宏,如这两个示例中所示;这两种类型可以组合在一个定义中。
块宏
BEGIN_INTERFACE_PART ^ END_INTERFACE_PART
^ 符号代表宏的主体 - 这允许从一个宏跳到另一个宏; ^ 符号周围的空格是必需的。
函数宏
RTTI_EMULATION()
Enterprise Architect跳过了令牌,包括括号内的所有内容。
函数宏也可以包含函数体:
RTTI_EMULATION() {}
在这种情况下, Enterprise Architect跳过了标记,包括括号内和大括号内的所有内容。请注记,如果函数宏包含函数主体,则它不能与块宏组合。
注记
- 您可以使用“设置>模型>传输>导出参考”和“导入参考”选项在模型之间传输这些语言宏(或预处理器宏)定义;宏导出为宏列表