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;