#If
#If PreprocessorExpression
...
[ #Else If PreprocessorExpression
... ]
[ #Else
... ]
#Endif
The #If ... [#Else ...] #Endif preprocessor directive permits the conditional compilation of alternate code segments.
PreprocessorExpression is a rudimentary boolean expression that can include the following:
-
A preprocessor boolean constant (see below).
-
A preprocessor constant compared to a string (see below).
-
The Or or the And keyword.
-
Parenthesis to group sub-expressions.
The only allowed preprocessor constants are:
Constant
|
Value
|
Comparison operators allowed
|
System
|
The operating system.
|
= , <>
|
Architecture or Arch
|
The CPU architecture.
|
= , <>
|
Version or Gambas
|
The compiler version.
|
= , <> , < , <= , > , >=
|
Debug
|
If debugging information is enabled.
|
None
|
Exec
|
Whether the -x switch was passed to the compiler (see discussion below).
|
None
|
True
|
The True value.
|
None
|
False
|
The False value.
|
None
|
Using the command line
gbc3 -x
when compiling your project, you can define the
Exec
preprocessor constant. The IDE passes
-x
to the compiler if and only if it creates an executable archive (.gambas file). Under the assumption that the project is always compiled via the IDE, you can use
Exec
to conditionally compile code into executable archives. See
this thread for a discussion of limitations of this method.
Examples
' Only one 'Print' line will be actually compiled by the following code
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 "Other !?"
#Endif
End
You can use parenthesis to use the Not keyword to test negatively.
Public bDebugging As Boolean
Public Sub Main()
#If (Not Exec)
bDebugging = True
#Endif
End
By using conditional compilation based on operating system or CPU architecture, you create an executable that
will be specific to the operating system or CPU architecture used at compilation time.
This is usually not a good idea, so try as much as possible to detect operating system or CPU architecture at runtime,
i.e. by testing the value of
System.Family and
System.Architecture in your code.