この記事は、David Intersimoneのブログの抄訳です
先日のDelphiCon 2021のセッション「Multi-Platform Explorations using Delphi, FMX, Feeds, REST and More」での講演の中で、uses文、変数定義、およびコードの一部にIFDEFを使用するサンプルコードを紹介いたしました。
このブログでは、Windows(Win32/Win64)、macOS、iOS、Androidの各プラットフォーム向けにコンパイルする際のdefineの使用例を紹介いたします。
また、各プラットフォームで実行したサンプルプログラムから出力したスクリーンショットも掲載しています。こちらのセッションリンクから講演のサンプルプロジェクトをすべてダウンロードできます。
下記のシンプルな DelphiのFireMonkey アプリケーションには、TButton と TMemo が配置されています。ButtonのOnClickイベントハンドラでは、コードがプラットフォームに関する情報と、各プラットフォームに定義されたコンパイラを出力しています。
uses
System.IOUtils;
procedure TForm1.Button1Click(Sender: TObject);
begin
case TOSVersion.Platform of
TOSVersion.TPlatform.pfWindows:
PlatformPath := 'Windows';
TOSVersion.TPlatform.pfMacOS:
PlatformPath := 'macOS';
TOSVersion.TPlatform.pfiOS:
PlatformPath := 'iOS';
TOSVersion.TPlatform.pfAndroid:
PlatformPath := 'Android';
TOSVersion.TPlatform.pfWinRT:
PlatformPath := 'WinRT';
TOSVersion.TPlatform.pfLinux:
PlatformPath := 'Linux'
else
PlatformPath := 'Unexpected platform'
end;
Memo1.Lines.Add('TPlatform: '+PlatformPath);
Memo1.Lines.Add(TOSVersion.ToString);
{$IF DEFINED(IOS)}
Memo1.Lines.Add('Defined: IOS');
{$ENDIF}
{$IF DEFINED(IOS32)}
Memo1.Lines.Add('Defined: IOS32');
{$ENDIF}
{$IF DEFINED(IOS64)}
Memo1.Lines.Add('Defined: IOS64');
{$ENDIF}
{$IF DEFINED(ANDROID)}
Memo1.Lines.Add('Defined: ANDROID');
{$ENDIF}
{$IF DEFINED(ANDROID32)}
Memo1.Lines.Add('Defined: ANDROID32');
{$ENDIF}
{$IF DEFINED(ANDROID64)}
Memo1.Lines.Add('Defined: ANDROID64');
{$ENDIF}
{$IF DEFINED(MACOS)}
Memo1.Lines.Add('Defined: MACOS');
{$ENDIF}
{$IF DEFINED(MACOS64)}
Memo1.Lines.Add('Defined: MACOS64');
{$ENDIF}
{$IF DEFINED(OSX)}
Memo1.Lines.Add('Defined: OSX');
{$ENDIF}
{$IF DEFINED(OSX64)}
Memo1.Lines.Add('Defined: OSX64');
{$ENDIF}
{$IF DEFINED(MSWINDOWS)}
Memo1.Lines.Add('Defined: MSWINDOWS');
{$ENDIF}
{$IF DEFINED(WIN32)}
Memo1.Lines.Add('Defined: WIN32');
{$ENDIF}
{$IF DEFINED(WIN64)}
Memo1.Lines.Add('Defined: WIN64');
{$ENDIF}
{$IF DEFINED(LINUX)}
Memo1.Lines.Add('Defined: LINUX');
{$ENDIF}
{$IF DEFINED(LINUX32)}
Memo1.Lines.Add('Defined: LINUX32');
{$ENDIF}
{$IF DEFINED(LINUX64)}
Memo1.Lines.Add('Defined: LINUX64');
{$ENDIF}
{$IF DEFINED(DCC)}
Memo1.Lines.Add('Defined: DCC');
{$ENDIF}
{$IF DEFINED(CONSOLE)}
Memo1.Lines.Add('Defined: CONSOLE');
{$ENDIF}
{$IF DEFINED(POSIX)}
Memo1.Lines.Add('Defined: POSIX');
{$ENDIF}
{$IF DEFINED(POSIX32)}
Memo1.Lines.Add('Defined: POSIX32');
{$ENDIF}
{$IF DEFINED(POSIX64)}
Memo1.Lines.Add('Defined: POSIX64');
{$ENDIF}
{$IF DEFINED(CPUX86)}
Memo1.Lines.Add('Defined: CPUX86');
{$ENDIF}
{$IF DEFINED(CPUX64)}
Memo1.Lines.Add('Defined: CPUX64');
{$ENDIF}
{$IF DEFINED(CPU32BITS)}
Memo1.Lines.Add('Defined: CPU32BITS');
{$ENDIF}
{$IF DEFINED(CPU64BITS)}
Memo1.Lines.Add('Defined: CPU64BITS');
{$ENDIF}
{$IF DEFINED(CPUARM)}
Memo1.Lines.Add('Defined: CPUARM');
{$ENDIF}
{$IF DEFINED(CPUARM32)}
Memo1.Lines.Add('Defined: CPUARM32');
{$ENDIF}
{$IF DEFINED(CPUARM64)}
Memo1.Lines.Add('Defined: CPUARM64');
{$ENDIF}
{$IFDEF DEBUG}
Memo1.Lines.Add('DEBUG is Defined');
{$ELSE}
Memo1.Lines.Add('DEBUG is Not Defined');
{$ENDIF}
end;
下図は、各プラットフォームのスクリーンショットです。





関連した情報として以下のdocwikiもご参考ください。
https://docwiki.embarcadero.com/RADStudio/Alexandria/ja/条件付きコンパイル(Delphi)
Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Free Delphi Community Edition Free C++Builder Community Edition







