Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - IFDEF - Zwei Direktiven mit AND prüfen?


Ratchet - Fr 16.04.10 12:25
Titel: IFDEF - Zwei Direktiven mit AND prüfen?
Gibt es eine Möglichkeit zwei Direktiven zu prüfen wie es in einer richtigen If-Anweisung auch möglich ist?
Ich könnte natürlich die IFDEFs verschachteln, dann muss ich aber Code doppelt schreiben, was ich vermeiden möchte.


Martok - Fr 16.04.10 13:03

IFDEFs verschachteln ist die übliche Vorgehensweise. Findet sich quer durch die ganze VCL.

Sowas ist also völlig normal:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
{$IFDEF WIN32}
  {$IFDEF PUREPASCAL}
   //foo
  {$ELSE}
   //bar
  {$ENDIF}
{$ENDIF}


Ratchet - Fr 16.04.10 13:09

Schon klar, aber mir geht es darum doppelten Code zu vermeiden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
{$IFDEF VER130}
  {$IFDEF SOME_DEF}
    Funktion1;
  {$ELSE}
    Funktion2;
  {$ENDIF}
{$ELSE}
  Funktion1;
{$ENDIF}


Ich will Funktion1 nur einmal im Code haben, denn in Wirklichkeit sind es mehrere Zeilen die gleich wären.


Gammatester - Fr 16.04.10 14:09

Sieh Dir mal die Onlinehilfe zur IG-Direktive {$IF expression} an. Hier die Einleitung beim englischen Delphi 6:
Zitat:
IF directive

Type Conditional compilation
Syntax {$IF expression}
Remarks

Compiles the source code that follows it if expression is True. expression must conform to Object Pascal syntax and return a Boolean value; it may contain declared constants, constant expressions, and the functions Defined and Declared.
Damit sind da Konstrukte möglich wie:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
const
  a=3;
  b=2;

{$if defined(VER140) or (((a=1) and (b=1)) or (a>0))}
 //foo
{$else}
  bar;
{$ifend}


Ratchet - Fr 16.04.10 15:55

Kann es sein, dass dies mit Delphi 5 noch nicht möglich ist? Finde dazu nichts in der Hilfe und der Compiler verweigert die Arbeit ^^

EDIT: Unter Delphi 2006 habe ich nun was in der Hilfe gefunden, aber das bezieht sich auf C/C++/.NET...


BenBE - Fr 16.04.10 16:13

Nein, $IF kam erst mit Delphi 7 oder 2995 IIRC.


Gausi - Fr 16.04.10 16:23

Ich hab hier grade kein Delphi zur Hand, aber geht nicht sowas?


Delphi-Quelltext
1:
2:
3:
4:
5:
{$IFDEF VER130}
  {$IFDEF SOME_DEF}
    {$DEFINE VER130_AND_SOME_DEF}      
  {$ENDIF}
{$ENDIF}


Dann kannst du den Fall für Funktion1 über die neue Def behandeln, und du hast den Code nur einmal. Das machen afaik auch die Jedis so.