我想使用图书馆" 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);
为什么这些声明不正确?
答案 0 :(得分:0)
#define
和MN_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_SETHMENU
和MN_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>'}