Ошибка при включении файлов .hpp для утилит стилей VCL, созданных в Embarcadero C ++ Builder - PullRequest
0 голосов
/ 23 мая 2018

Я хочу использовать библиотеку "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 Ответ

0 голосов
/ 23 мая 2018

Вероятно, существуют уже существующие операторы #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 в сгенерированный *Файл 1028 *, чтобы при необходимости он мог извлекать другие заголовочные файлы C / C ++, например:

{$HPPEMIT '#include <OtherFile.h>'}
...