1

我想在 Embarcadero C++Builder 10.2 Tokyo 中使用库“VCL Style Utils”。

所以我创建了一个新项目并添加了:

Vcl.Styles.Utils.Graphics.pas
Vcl.Styles.Utils.Menus.pas
Vcl.Styles.Utils.SysControls.pas
Vcl.Styles.Utils.SysStyleHook.pas

构建成功并.hpp为这些文件生成.pas文件。

然后我创建另一个项目并包含.hpp生成的文件。

但是在构建时出现此错误:

[bcc32 错误] Vcl.Styles.Utils.Menus.hpp(164):E2040 声明错误终止。

这是 Vcl.Styles.Utils.Menus.hpp 的第 163 和 164 行:

static const System::Word MN_SETHMENU = System::Word(0x1e0);
static const System::Word MN_GETHMENU = System::Word(0x1e1);

为什么这些声明不正确?

4

1 回答 1

0

范围内的另一个 C/C++ 头文件中可能存在预先存在的#define语句MN_SETHMENU,例如:MN_GETHMENU

#define MN_SETHMENU 0x01E0
#define MN_GETHMENU 0x01E1

如果是这样,那将干扰 中生成的声明Vcl.Styles.Utils.Menus.hpp,使编译器将它们视为:

static const System::Word 0x01E0 = System::Word(0x1e0);
static const System::Word 0x01E1 = System::Word(0x1e1);

这显然是错误的,因此也是错误的。

Vcl.Styles.Utils.Menus.pas(以及.pas一般的文件中),and 的声明MN_SETHMENUMN_GETHMENU以及已经在 C/C++ 头文件中预定义的任何其他内容)需要用{$EXTERNALSYM ...}指令标记,这样它们就不会在生成的文件中重新声明.hpp,例如:

{$EXTERNALSYM MN_SETHMENU} // <-- add this
MN_SETHMENU = $01E0;

{$EXTERNALSYM MN_GETHMENU} // <-- add this
MN_GETHMENU = $01E1;

如有必要,使用该{$HPPEMIT '...'}指令将合适#include的语句添加到生成的.hpp文件中,以便它可以根据需要拉入其他 C/C++ 头文件,例如:

{$HPPEMIT '#include <OtherFile.h>'}
于 2018-05-23T17:15:41.873 回答