Conditional compilation

Top  Previous  Next

User interface > Translation > Preprocessing > Conditional compilation


Delphi2C# uses a preprocessor (pre-translator), which prepares the source text so that directives for the conditional compilation are evaluated and removed.

However, unlike in Delphi conditional compilation, the Delphi2C# pre-processor only can evaluate  conditional symbols, but usually cannot evaluate constants in the Delphi language and such constants never can be set by conditional compilation.


For example, conditional expressions like


{$IF CompilerVersion >= 17.0}



are evaluated, but integer values are evaluated and only operators, which also exist in C++. Sizeof-expressions like tho following are evaluated too


{$IF SizeOf(Extended) >= 10} 




as long, as the size can be taken from the type-map. In System pas the is the following code:


  {$IF SizeOf(Extended) <> SizeOf(TExtended80Rec)}

    {$MESSAGE ERROR 'TExtended80Rec has incorrect size'}

  {$ENDIF }


"TExtended80Rec" is not defined in the type-map and therefore Delphi2Cpp cannot evaluate the expression.


If there is an expression, which cannot be evaluated, a warning is written into the code:


// pre-processor can't evaluate ...


The source code has to be corrected by hand then.



The Delphi2C# pre-processor cannot set new Delphi constants as in the following code from the Jedi components in JvConsts.pas





  SDelphiKey = 'Software\Embarcadero\BDS\20.0';



  {$IF not declared(SDelphiKey)}

    {$MESSAGE FATAL 'Declaration for SDelphiKey is missing'}



Even if DELPHI26 is set, SDelphiKey would not be declared.



Include directives are executed correctly.


{$I filename}

{$INCLUDE filename}


The file filename is included into the source.



The definitions can be set in the options dialog.




This page belongs to the Delphi2C# Documentation

Delphi2C# home  Content