包含Embarcadero C ++ Builder中生成的VCL Style Utils的.hpp文件时出错

时间:2018-05-23 15:45:18

标签: c++builder c++builder-10.2-tokyo vcl-styles.-utils

我想使用图书馆" VCL Style Utils"在Embarcadero C ++ Builder 10.2 Tokyo。

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

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);

为什么这些声明不正确?

1 个答案:

答案 0 :(得分:0)

#defineMN_SETHMENU可能存在于另一个C / C ++头文件中的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个文件中),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>'}