Compiler Directives

27.1 Common Switch Directives

{$R+} / {$RANGECHECKS ON} Range checking (arrays, subranges) {$Q+} / {$OVERFLOWCHECKS ON} Integer overflow checking

Short-circuit Boolean evaluation (default) {$C+} / {$ASSERTIONS ON} Enable Assert I/O checking (legacy file I/O) Long strings (default) Typed constants are read-only (default) Generate RTTI for published members {$WARN SYMBOL_DEPRECATED OFF} Toggle specific warnings {$HINTS OFF} / {$WARNINGS OFF} Toggle hints/warnings {$POINTERMATH ON} {$SCOPEDENUMS ON} {$ZEROBASEDSTRINGS ON}

0-based string indexing (legacy mobile; avoid) {$APPTYPE CONSOLE} {$R *.res} / {$R *.dfm} Link resources / form files {$I file.inc} Include a file {$LIBSUFFIX AUTO} (11+) Package version suffix {$WEAKLINKRTTI ON} Reduce RTTI linking {$DEFINE X} / {$UNDEF X} Define/undefine symbols

27.2 Conditional Compilation

Predefined symbols: MSWINDOWS, WIN32, WIN64, MACOS, IOS, ANDROID, LINUX, POSIX, CPUX86, CPUX64, CPUARM, CPUARM64, DEBUG, RELEASE, CONSOLE, UNICODE, VER360 (12.x), NEXTGEN (legacy).

{$IFDEF DEBUG}
  Writeln('Debug build');
{$ENDIF}

{$IF Defined(MSWINDOWS)}
  uses Winapi.Windows;
{$ELSEIF Defined(ANDROID)}
  uses Androidapi.Helpers;
{$ELSEIF Defined(IOS)}
  uses iOSapi.Foundation;
{$ELSEIF Defined(MACOS)}
  uses Macapi.Foundation;
{$ELSEIF Defined(LINUX)}
  uses Posix.Unistd;
{$ENDIF}

{$IF CompilerVersion >= 36.0}       // Delphi 12 Athens = 36.0, 11 Alexandria = 35.0, 13 Florence = 37.0
  // newer feature
{$ENDIF}

{$IFDEF CPU64BITS} ... {$ENDIF}
{$IF SizeOf(Pointer) = 8} ... {$IFEND}

27.3 Inline Assembly

Win32 allows mixing asm..end blocks inside Pascal routines. Win64 requires whole-routine assembler functions. ARM/mobile targets don't support inline assembly (use C libraries or intrinsics instead).

function AddAsm(A, B: Integer): Integer;
asm
  {$IFDEF CPUX86}
  ADD EAX, EDX          // register convention: A in EAX, B in EDX, result in EAX
  {$ELSE}
  MOV EAX, ECX          // Win64: A in ECX, B in EDX
  ADD EAX, EDX
  {$ENDIF}
end;