Embarcadero C++Builder引用VCL Style Utils生成的.hpp文件报错原因咨询
解决C++Builder 10.2中VCL Style Utils头文件编译报错E2040的问题
我来帮你拆解这个问题的原因和解决办法:
你的场景回顾
你在Embarcadero C++Builder 10.2 Tokyo中使用VCL Style Utils库时,做了这些操作:
- 创建新项目并添加了以下Pascal文件:
Vcl.Styles.Utils.Graphics.pasVcl.Styles.Utils.Menus.pasVcl.Styles.Utils.SysControls.pasVcl.Styles.Utils.SysStyleHook.pas
- 编译成功后生成了对应的
.hpp头文件 - 在另一个项目中包含这些
.hpp文件时,遇到编译错误:[bcc32 Error] Vcl.Styles.Utils.Menus.hpp(164): E2040 Declaration terminated incorrectly.
出错的代码行是.hpp文件的第163-164行:
static const System::Word MN_SETHMENU = System::Word(0x1e0); static const System::Word MN_GETHMENU = System::Word(0x1e1);
错误原因
这个问题的核心是重复定义冲突:
Windows SDK的系统头文件(比如windows.h)已经通过宏定义了MN_SETHMENU和MN_GETHMENU这两个菜单消息ID。而VCL Style Utils的Pascal代码中又重复声明了这两个常量,当转换为C++头文件后,编译器会把这些声明和系统宏混淆,导致无法正确解析语法,抛出E2040错误。
Pascal编译时没问题是因为它的作用域和宏处理逻辑和C不同,不会触发这类冲突,但C的宏优先级更高,直接干扰了常量声明的解析。
解决办法
你可以任选一种方式修复:
- 直接修改生成的
.hpp文件
打开Vcl.Styles.Utils.Menus.hpp,找到那两行常量声明,直接注释掉或者删除它们——因为系统已经提供了这些定义,不需要重复声明。 - 修改原始Pascal文件重新生成头文件
打开Vcl.Styles.Utils.Menus.pas,找到对应声明这两个常量的代码段并删除,然后重新编译Pascal文件生成新的.hpp文件,再在C++项目中使用。 - 调整头文件包含顺序
在包含Vcl.Styles.Utils.Menus.hpp之前,先包含Windows系统头文件(比如#include <windows.h>),让系统宏先被定义,这样编译器会正确处理后续的常量声明(不过这种方式不如前两种可靠)。
内容的提问来源于stack exchange,提问作者Arnaud
相关产品推荐
相关产品推荐

