You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.pas
    • Vcl.Styles.Utils.Menus.pas
    • Vcl.Styles.Utils.SysControls.pas
    • Vcl.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的宏优先级更高,直接干扰了常量声明的解析。

解决办法

你可以任选一种方式修复:

  1. 直接修改生成的.hpp文件
    打开Vcl.Styles.Utils.Menus.hpp,找到那两行常量声明,直接注释掉或者删除它们——因为系统已经提供了这些定义,不需要重复声明。
  2. 修改原始Pascal文件重新生成头文件
    打开Vcl.Styles.Utils.Menus.pas,找到对应声明这两个常量的代码段并删除,然后重新编译Pascal文件生成新的.hpp文件,再在C++项目中使用。
  3. 调整头文件包含顺序
    在包含Vcl.Styles.Utils.Menus.hpp之前,先包含Windows系统头文件(比如#include <windows.h>),让系统宏先被定义,这样编译器会正确处理后续的常量声明(不过这种方式不如前两种可靠)。

内容的提问来源于stack exchange,提问作者Arnaud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:51:29