包中是否包含条件表达式?

时间:2011-11-29 03:58:27

标签: delphi compiler-construction delphi-xe conditional-compilation conditional-expressions

请考虑以下代码段:

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 个答案:

答案 0 :(得分:12)

我在过去发现同样的问题,即使使用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}

答案 1 :(得分:8)

package个模块与programlibrary个模块不同。它们不包含可执行代码,您不能use个单位。因此,从包文件中看不到像RTLVersion这样的符号。您唯一的选择是使用$IFDEF

答案 2 :(得分:2)

我确信我刚刚找到了原因。请考虑以下事项:

{$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}

所以,它似乎是编译器的行为正确,但发出了一个相当误导(如果不是错误的)有关符号不是常量表达式的消息,而有问题的符号实际上是未声明的