#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.