我已经在C++ Builder XE3的Windows 7 x32上安装了当前稳定的绝地代码库。它可以正常工作,但前提是我不包括像JclFileUtils.hpp这样的文件,这些文件包括JclWin32.hpp。然后,我总是得到编译器错误E2040:“声明终止错误”(在JclWin32.hpp文件中,第682行,在以下代码段中的第二行):
#define NetApi32 L"netapi32.dll"
static const System::Int8 CSIDL_PROGRAM_FILESX86 = System::Int8(0x2a);
#define RT_MANIFEST (System::WideChar *)(0x18)我既不知道这个错误是否来自于此,也没有找到任何提示。可能是什么原因?提前谢谢。
发布于 2012-09-18 13:14:34
我得到了帮助和解决这个问题的方法。只需替换静态const声明:
static const System::Int8 CSIDL_PROGRAM_FILESX86 = System::Int8(0x2a);有了这个宏定义:
#define CSIDL_PROGRAM_FILESX86 0x2a发布于 2017-03-27 17:32:33
这是JclWin32.pas中的一个bug。
在C/C++中,Win32 API使用预处理器#define语句在shlobj.h头中声明#define值,例如:
#define CSIDL_PROGRAM_FILESX86 0x002a在运行预处理器并执行#define符号替换之后,编译器将在JclWin32.hpp中看到以下无效声明
static const System::Int8 0x002a = System::Int8(0x2a);JCL根本不应该重新声明CSIDL_PROGRAM_FILESX86 (或任何其他CSIDL值)。它应当是:
Winapi.ShlObj单元,它已经声明了CSIDL值。Winapi.ShlObj单元,那么它至少应该将其手动CSIDL值声明为{$EXTERNALSYM},这样它们就不会出现在生成的JclWin32.hpp文件中。如果需要的话,JCL可以包含一个{$HPPEMIT '#include <shlobj.h>'}语句来提取现有的Win32 API声明,以供C/C++项目使用。https://stackoverflow.com/questions/12459009
复制相似问题