Ошибка при включении файлов.hpp для утилит стилей VCL, созданных в Embarcadero C++ Builder
Я хочу использовать библиотеку "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 завершено неправильно.
Вот строки 163 и 164 Vcl.Styles.Utils.Menus.hpp:
static const System::Word MN_SETHMENU = System::Word(0x1e0);
static const System::Word MN_GETHMENU = System::Word(0x1e1);
Почему эти декларации неверны?
1 ответ
Есть, вероятно, уже существующие #define
заявления для MN_SETHMENU
а также MN_GETHMENU
в другом заголовочном файле C/C++, который находится в области видимости, например:
#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>'}