Сужающее преобразование значения «int» в «short» здесь не допускается.
Недавно я обновил свой SourcePro до версии 2021, и во время настройки RCB, когда он предлагает мне выбрать диалект C++, я выбрал единственный доступный вариант, то есть C++14. После установки я начал компилировать код Tuxedo и в настоящее время сталкиваюсь со следующими ошибками в нескольких файлах: около 200-250 файлов в моем проекте Tuxedo, а ниже приведены подробности моей ОС Solaris и компилятора.
имя-а:
SunOS nzdrb12z 5.11 11.4.40.107.3 sun4v sparc sun4v неглобальная зона
копия -V:
копия: Studio 12.6 Sun C 5.15 SunOS_sparc 2017/05/30
значение «короткий» здесь не допускается. «/app/sdasup/home/mhp/source/develop/bc/include/bcMwServicesGuid.h», строка 36: Ошибка: сужающее преобразование значения «int» в «short» здесь не разрешено. «/app/sdasup/home/mhp/source/develop/bc/include/bcMwServicesGuid.h», строка 41: Ошибка: сужающее преобразование значения «int» в «short» здесь не допускается. «/app/sdasup/home/mhp/source/develop/bc/include/bcMwServicesGuid.h», строка 45: Ошибка: сужающее преобразование значения «int» в «short» здесь не разрешено.
Предположим, я выбрал первый файл сообщения об ошибке, чтобы открыть bcIControlBlock.h, и номер строки 34 указывает на следующий код:
DEFINE_GUID(IID_IAbcIControlBlock, 0xc7645022, 0x93e9, 0x11d1, 0x9d, 0x90, 0x0, 0x0, 0xf6, 0x4e, 0x16, 0x6a);
при поиске макроса он имеет следующее определение:
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
EXTERN_C const GUID name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
В качестве обходного пути я устал от следующего, чтобы решить эту проблему:
DEFINE_GUID(IID_IAbcIControlBlock, 0xc7645022, (short)0x93e9, 0x11d1, 0x9d, 0x90, 0x0, 0x0, 0xf6, 0x4e, 0x16, 0x6a);
Хотя это работает нормально, я очень сомневаюсь в подходе, который я использовал для решения проблемы. Однако изменение нескольких файлов кажется болезненным.
Вопросы:
- Верно ли обходное решение?
- Если да, то как его можно сделать более общим, чтобы изменить его в одном месте, а не в нескольких файлах?
- Если нет, то какой лучший подход к решению, чтобы он больше ничего не ломал?
Заранее спасибо.
1 ответ
В идеале все поля должны быть объявлены беззнаковыми (см., например, эту документацию Microsoft ). Но некоторые языки (например, Java) не поддерживают целые числа без знака. Итак, похоже, что ваша структура C++ была определена программистом Java.
Если вы можете изменить определение
GUID
, сделай это. Если нет, то, боюсь, вам придется применить свои
(short)
отброшен ко всем вхождениям
DEFINE_GUID
макрос (если только ваш компилятор не имеет способа отключить эту ошибку, как это предлагается в комментариях к вашему исходному сообщению). Java-программистам приходится делать это постоянно.