预订演示
前页 后页

语言宏

在对 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跳过了标记,包括括号内和大括号内的所有内容。请注记,如果函数宏包含函数主体,则它不能与块宏组合。

注记

  • 您可以使用“设置>模型>传输>导出参考”和“导入参考”选项在模型之间传输这些语言宏(或预处理器宏)定义;宏导出为宏列表

了解更多