Не нарушены ли условные выражения внутри пакетов? - PullRequest
7 голосов
/ 29 ноября 2011

Рассмотрим следующий фрагмент:

requires
  designide,
  rtl,
  vcl,
  {$IF RTLVersion < 19.0}            // E2026 Constant expression expected
  //{$IF CompilerVersion = 22.0}     // same as above
  vcljpg;
  {$ELSE}
  vclimg;
  {$IFEND}

Кажется, это абсолютно синтаксически правильно.Тем не менее, компилятор захлебывается и сообщает Constant expression expected.Что на самом деле происходит здесь?

Технический: в настоящее время тестируется только на XE (15.0.3953.35171).

Конечно, предложения обходного пути приветствуются.

Ответы [ 3 ]

12 голосов
/ 29 ноября 2011

Я обнаружил такую ​​же проблему в прошлом, даже с delphi 2007. В качестве обходного пути я использую inc-файл с условными определениями, а затем использую {$IFDEF} вместо {$IF}

как-то так

{$I MyDefines.INC}


requires
  designide,
  rtl,
  vcl,
 {$IFDEF DELPHI_XE_UP} //the DELPHI_XE_UP is defineed inside of MyDefines.INC
  uNewlib;
 {$ELSE}
  uOldLib;
 {$ENDIF}
8 голосов
/ 29 ноября 2011
Модули

package отличаются от модулей program и library.Они не содержат исполняемый код, и вы не можете use единиц.Поэтому такие символы, как RTLVersion, просто не видны из файла пакета.Ваш единственный вариант - использовать $IFDEF.

2 голосов
/ 29 ноября 2011

Я убежден, что я только что нашел причину.Рассмотрим следующее:

{$IF not Declared(RTLVersion)}
{$MESSAGE WARN 'There is no RTL'}
{$IFEND}
{$IF not Declared(CompilerVersion)}
{$MESSAGE WARN 'nor are compiler intrinsics at all'}
{$IFEND}
{$IF not Declared(System)}
{$MESSAGE ERROR 'Because package not uses System implicitly'}
{$IFEND}

Итак, похоже, что компилятор ведет себя правильно, но выдает довольно вводящее в заблуждение (если не ошибочное) сообщение о том, что символ не является константным выражением, а рассматриваемый символ на самом деле необъявленной !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...