Сужающее преобразование значения «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. Верно ли обходное решение?
  2. Если да, то как его можно сделать более общим, чтобы изменить его в одном месте, а не в нескольких файлах?
  3. Если нет, то какой лучший подход к решению, чтобы он больше ничего не ломал?

Заранее спасибо.

1 ответ

В идеале все поля должны быть объявлены беззнаковыми (см., например, эту документацию Microsoft ). Но некоторые языки (например, Java) не поддерживают целые числа без знака. Итак, похоже, что ваша структура C++ была определена программистом Java.

Если вы можете изменить определение GUID, сделай это. Если нет, то, боюсь, вам придется применить свои (short)отброшен ко всем вхождениям DEFINE_GUIDмакрос (если только ваш компилятор не имеет способа отключить эту ошибку, как это предлагается в комментариях к вашему исходному сообщению). Java-программистам приходится делать это постоянно.

Другие вопросы по тегам