Zaczniemy od podstaw - omówimy na początek symbole pre-definiowane, które są podstawą do sprawnej kompilacji warunkowej. Na początek trochę nudów i może dla większości rzeczy oczywistych, jednak spokojnie :). Jeden z artykułów będzie o "białych krukach" wśród dyrektyw.
Symbole pre-definiowane to symbole które zostały zdefiniowane przez kompilator w zależności od przeróżnych okoliczności (np. system operacyjny linux lub windows). Dzięki temu jesteśmy w stanie generować różny kod. Standardowo sami możemy definiować symbole o wymyślonych przez nas nazwach, bądź je usuwać:
{$DEFINE SOME_NAME} // definiujemy symbol o nazwie SOME_NAME
{$UNDEF SOME_NAME} // kasujemy symbol o nazwie SOME_NAME
Zaczniemy rysem historycznym (uwielbiam te nazwy kodowe!). Przytoczę wersje kodowe produktów, cytując artykuł "Delphi History" i wzbogacając go o nowe pozycje (uwzględniając najnowszy "RAD Studio, Delphi and C++Builder Roadmap"):
Project Commodore 2010/2011
Project Delphi "X" 2010
Embarcadero RAD Studio 2010 Weaver 2009
CodeGear C++ Builder 2009 Barracuda 2008
CodeGear RAD Studio 2009 - Unicode Tiburón 2008
CodeGear RAD Studio 2007 Highlander 2007, Sept 5
Chrome 2.0 by RemObjects Joyride 2007, Aug 1
CodeGear C++ Builder 2007 Cogswell 2007, June 5
CodeGear Delphi for PHP Astro 2007, Mar 27
CodeGear Delphi 2007 for Vista and AJAX Spacely 2007, Mar 19
Borland Developer Studio 2006 - W32, .Net, C++ and C# DeXter 2005, Oct 10
Borland Delphi 2005 - C# and Delphi Diamondback 2004, Oct 12
Borland Delphi 8 for .Net Octane 2003, Dec 22
Borland C++BuilderX Tomahawk 2003, Aug 28
Borland C#Builder 1.0 Sidewinder (Galileo IDE 1.0) 2003, Jun 16
Borland Delphi.NET compiler (.Net 1.0) Morpheus 2003
Borland Delphi 7 Aurora 2002, Aug 9
Borland C++ Builder 6.0 Riptide 2002, Feb 1
Borland Delphi 6 Illiad 2001, May 21
Borland C++ Builder 5.0 Rampage 2000, Jan 30
Borland Delphi 5 Argus 1999, Aug 10
Borland Delphi/400 outsourced 1999, Feb
Borland Delphi 4 Allegro 1998, Jun 17
Borland Delphi 3 Ivory 1997, Aug 5
Borland Delphi 2 32bit/Win95 Polaris 1996, Feb 10
Borland Delphi 1 16bit/Win3.x Delphi95, Wasabi, Mango, AppBuilder 1995, Feb 14
i teraz poniżej zobaczmy, jakimi symbolami pre-definiowanymi zostały oznaczone poszczególne wersje, nie tylko Delphi ale i C++ (możliwe jest miksowanie kodu C++ i Delphi), w oparciu o artykuł "Borland Compiler Conditional Defines"
{$DEFINE VER210} // Embarcadero RAD 2010 v14.0
{$DEFINE VER200} // CodeGear Delphi 2009 v12.0
{$DEFINE VER200} // CodeGear C++ Builder 2009 v12.0
{$DEFINE VER190} // CodeGear Delphi 2007 for .NET v11.0
{$DEFINE VER185} // CodeGear Delphi 2007 for Win32 v11.0
{$DEFINE VER180} // CodeGear Delphi 2007 for Win32 v11.0
{$DEFINE VER180} // Borland Developer Studio 2006 v10.0
{$DEFINE VER170} // Borland Delphi 2005 v9.0
{$DEFINE VER160} // Borland Delphi 8 for .NET v8.0
{.$DEFINE ?} // C++BuilderX
{$DEFINE VER160} // Borland C#Builder v1.0
{$DEFINE VER150} // Borland Delphi 7 v7.0
{$DEFINE VER140} // Borland Kylix 3 v3.0
{$DEFINE VER140} // Borland C++Builder 6
{$DEFINE VER140} // Borland Kylix 2 v2.0
{$DEFINE VER140} // Borland Delphi 6 v6.0
{$DEFINE VER140} // Borland Kylix v1.0
{$DEFINE VER130} // Borland C++Builder 5
{$DEFINE VER130} // Borland Delphi 5 v5.0
{$DEFINE VER125} // Borland C++Builder 4
{$DEFINE VER120} // Borland Delphi 4 v4.0
{$DEFINE VER110} // Borland C++Builder 3
{$DEFINE VER100} // Borland Delphi 3 v3.0
{.$DEFINE ?} // Borland C++ 5
{$DEFINE VER93} // Borland C++Builder 1
{$DEFINE VER90} // Borland Delphi 2 v2.0
{.$DEFINE ?} // Borland C++ 4.5
{$DEFINE VER80} // Borland Delphi v1.0
{.$DEFINE ?} // Borland C++ 4
{$DEFINE VER70} // Borland Pascal 7 v7.0
{.$DEFINE ?} // Borland C++ 3.1
{$DEFINE VER70} // Turbo Pascal for Windows 1.5 v1.5
{.$DEFINE ?} // Turbo C++ for DOS 3
{.$DEFINE ?} // Borland C++ 3
{.$DEFINE ?} // Turbo C++ for Windows 3 (Win16)
{.$DEFINE ?} // Turbo Pascal for Windows 1.0 v1.0
{.$DEFINE ?} // Borland C++ 2
{$DEFINE VER60} // Turbo Pascal 6 v6.0
{.$DEFINE ?} // Turbo C++ for DOS
{.$DEFINE ?} // Turbo C for DOS 2
{$DEFINE VER55} // Turbo Pascal 5.5 v5.5
{.$DEFINE ?} // Turbo C for DOS v1.5
{$DEFINE VER50} // Turbo Pascal 5 v5.0
{$DEFINE VER40} // Turbo Pascal 4 v4.0
{.$DEFINE ?} // Turbo C for DOS
{.$DEFINE ?} // Turbo Pascal 3 v3.0
{.$DEFINE ?} // Turbo Pascal 2 v2.0
{.$DEFINE ?} // Turbo Pascal 1 v1.0
Nieźle? :D To nie wszystko. Istnieją także symbole definiowane w zależności od środowiska/warunków/wersji w jakim kod został skompilowany (część z nich można znaleźć na tej oficjalnej stronie).
{$DEFINE CONSOLE} // defioniowana w projektach gdzie została użyta dyrektywa {$APPTYPE CONSOLE}
{$DEFINE CONDITIONALEXPRESSIONS} // definiowane w przypadku gdy możliwe jest testowanie warunków poprzez używanie dyrektywy $IF
{$DEFINE DEBUG} // gdy kompilujemy kod w trybie debugowania
{$DEFINE CPU386} // procesor Intel 386 i późniejszy
{$DEFINE WINDOWS} // używamy Windowsa - definicja "depracted" i zalecane jest używanie MSWINDOWS
{$DEFINE MSWINDOWS} // używamy Windowsa
{$DEFINE WIN32} // Windows 32 bitowy
{$DEFINE WIN64} // Windows 64 bitowy
{$DEFINE LINUX} // Linux
{$DEFINE NOT} // zebezpiecznie kou przed próbami automatycznej modyfikacji na różnych platformach
{$DEFINE MACOSX} // MacOSX! :D (pojawia się w kodzie D2010)
{$DEFINE UNICODE} // Wersja Delphi z unicode
{$DEFINE RTL} // wersja Delphi dla .NET
Zgrzeszyłbym nie przedstawiając pre-definiowanych symboli w FreePascalu. FreePascal posiada szereg swoich własnych symboli nieco odmiennych czy wybrakowanych w stosunku do Delphi, jednak istnieje plik zgrabnie ujednolicający definicje FPC i Delphi (patrz niżej opis pliku jedi.inc). Poniższa lista powstała w oparciu o "Appendix G -
Compiler defines during compilation" gdzie można odnaleźć bardziej kompletne zestawienie.
{$DEFINE FPC_LINK_DYNAMIC} // Kiedy ustawiliśmy linkowanie dynamiczne
{$DEFINE FPC_LINK_STATIC} // Dla linkowania statycznego (domyślnie)
{$DEFINE FPC_LINK_SMART} // Defioniowane dla "sprytnego linkowania" (ang. smartlinking)
{$DEFINE FPC_CROSSCOMPILING} // Kiedy docelowa platforma jest inna niż ta na któej kompilujemy
{$DEFINE FPC} // Definiowane dla FreePascala
{$DEFINE VER2} // Definiowane dla Free Pascala 2.x.x.
{$DEFINE VER2_0} // Definiowane dla Free Pascala 2.0.x.
{$DEFINE VER2_2} // Definiowane dla Free Pascala 2.2.x.
{$DEFINE FPC_DELPHI} // Free Pascal w "Delphi mode" (dyrektywa $MODE DELPHI)
{$DEFINE FPC_OBJFPC} // Free Pascal w "OBJFPC mode" (dyrektywa $MODE OBJFPC)
{$DEFINE FPC_TP} // Free Pascal w "Turbo Pascal mode" (dyrektywa $MODE TP)
{$DEFINE FPC_GPC} // Free Pascal w "GNU Pascal mode" (dyrektywa $MODE GPC)
Jeszcze więcej o symbolach pre-definiowanych możemy znaleźć w pliku jedi.inc - jest to bardzo użyteczny plik, który po dołączeniu za pomocą dyrektywy
unit Unit1;
{$I jedi.inc}
interface {...}
umożliwia nam łatwiejsze sprawdzanie co/jak/która wersja (np. definiuje DELPHI6_UP - symbol definiowany dla Delphi6 i każdego następnego) . Zachęcam do jego analizy. Jako alternatywy można też użyć pliku GX_CondDefine.inc z pluginu gexperts (informacja pochodzi z tej strony)
New art soon. gl&hf
Brak komentarzy:
Prześlij komentarz