Ive*_*aev 12 delphi conditional-compilation defined conditional-statements delphi-xe5
在XE5中所有条件编译如
{$IFDEF MSWINDOWS}
Run Code Online (Sandbox Code Playgroud)
被替换为
{$IF defined(MSWINDOWS)}
Run Code Online (Sandbox Code Playgroud)
例如XE4中的System.Diagnostics.pas
...
implementation
{$IFDEF MSWINDOWS}
uses Winapi.Windows;
{$ENDIF}
{$IFDEF MACOS}
uses Macapi.Mach;
{$ENDIF}
{ TStopwatch }
...
Run Code Online (Sandbox Code Playgroud)
现在在XE5中它看起来像:
...
implementation
{$IF defined(MSWINDOWS)}
uses Winapi.Windows;
{$ELSEIF defined(MACOS)}
uses Macapi.Mach;
{$ELSEIF defined(POSIX)}
uses Posix.Time;
{$ENDIF}
{ TStopwatch }
...
Run Code Online (Sandbox Code Playgroud)
是否有任何特殊原因我应该迁移我的类似调用?
Joh*_*ica 14
根据Delphi文档:
http://docwiki.embarcadero.com/RADStudio/XE6/en/Conditional_compilation_%28Delphi%29
条件指令{$ IFDEF},{$ IFNDEF},{$ IF},{$ ELSEIF},{$ ELSE},{$ ENDIF}和{$ IFEND}允许您根据状态编译或抑制代码条件符号.
在{$IFDEF}和{$IFNDEF}只允许您预先将集定义工作{$DEFINE ...}.
然而,该{$IF ..}指令更灵活,因为:
除{$ IF}和{$ ELSEIF}之外的任何条件指令都不能引用Delphi标识符.
const LibVersion = 6; //One constant to define the libversion.
{$IF LibVersion >= 10.0}
do stuff that covers LibVersion 10,11 and 12
{$ELSEIF Libversion > 5.0}
do other stuff that covers LibVersion 6,7,8,9
{$IFEND}
Run Code Online (Sandbox Code Playgroud)
如果您尝试使用定义执行此操作,则必须执行此操作
{$DEFINE Lib1}
{$DEFINE Lib2}
{$DEFINE Lib3}
{$DEFINE Lib4}
{$DEFINE Lib5}
{$DEFINE Lib6} //all previous versions have to be defined.
{$IFDEF Lib10}
do stuff that covers LibVersion 10, 11 and 12
{$ELSE}
{$IFDEF Lib6}
do stuff that covers LibVersion 6,7,8,9
{$ENDIF}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
它只是处理定义的稍高级版本.
{$ IF ..}表示法更强大,它允许您查询常量表达式而不仅仅是定义.
该{$IF ..}指令是在Delphi 6中引入的.
我猜Embarcadero决定清理代码库.