Ошибка при включении файлов.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>'}
Другие вопросы по тегам