Не нарушены ли условные выражения внутри пакетов?
Рассмотрим следующий фрагмент:
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 ответа
Я обнаружил ту же проблему в прошлом даже с 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}
package
модули отличаются от program
а также library
модули. Они не содержат исполняемый код, и вы не можете use
единицы. Поэтому такие символы, как RTLVersion
просто не видны из файла пакета. Ваш единственный вариант - использовать $IFDEF
,
Я убежден, что я только что нашел причину. Учтите следующее:
{$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}
Таким образом, похоже, что компилятор ведет себя правильно, но выдает довольно вводящее в заблуждение (если не ошибочное) сообщение о том, что символ не является константным выражением, а рассматриваемый символ фактически не объявлен!