#If
#If EspressionePreprocessore
...
[ #Else If EspressionePreprocessore
... ]
[ #Else
... ]
#Endif
Le direttive del preprocessore #If ... #Endif, permettono la compilazione condizionale del codice.
EspressionePreprocessore è una rudimentale espressione booleana che comprende cio che segue:
-
Una costante booleana (vedere sotto).
-
Una costante comparata ad una stringa (vedere sotto).
-
La parola chiave Or o And.
-
Parentesi con gruppi di sub-espressioni.
Le costanti del preprocessore consentite sono:
Costante
|
Valore
|
Operatori di comparazione permessi
|
System
|
Il sistema operativo.
|
= , <>
|
Architecture or Arch
|
L'architettura della CPU.
|
= , <>
|
Version or Gambas
|
La versione del compilatore.
|
= , <> , < , <= , > , >=
|
Debug
|
Se le informazioni di debugging sono fornite.
|
Nessuno
|
True
|
Il valore Vero (True).
|
Nessuno
|
False
|
Il valore Falso (False).
|
Nessuno
|
Utilizzando la riga di comando
gbc3 -x
durante la compilazione del progetto, è possibile definire la costante del preprocessore
Exec
. L'IDE passa
-x
al compilatore se e solo se crea un archivio eseguibile (file .gambas). Partendo dal presupposto che il progetto è sempre compilato tramite l'IDE, è possibile utilizzare
Exec
per compilare in modo condizionale il codice in archivi eseguibili. Vedi
questo thread per una discussione sui limiti di questo metodo.
Esempi
' Solo una delle linee 'Print' qui sotto mostrate sarà effettivamente compilata.
Public Sub Main()
#If System = "Linux"
#If Architecture = "x86_64"
Print "Linux 64 bits"
#Else
Print "Linux 32 bits"
#Endif
#Else If System = "FreeBSD"
Print "FreeBSD ?"
#Else
Print "Altro !?"
#Endif
End
Utilizzando la compilazione condizionale basata su sistema operativo o l'architettura della CPU, si crea un eseguibile che
sarà specifico per il sistema operativo o l'architettura della CPU utilizzata in fase di compilazione.
Questa di solito non è una buona idea, fate in modo di testare il più possibile il sistema operativo o l'architettura della CPU durante l'esecuzione dell'applicativo,
testando cioè il valore di
System.Family e
System.Architecture nel vostro codice.