## 16. Preprocessor

The Vala preprocessor is a particular part of Vala that acts at syntax level only, allowing you to conditionally write pieces of your software depending upon certain compile-time conditions. Preprocessor directives will never be generated in the resulting code.

### 16.1 Directives syntax

All preprocessor directives start with a hash (#), except for the first line of a file starting with #! (used for Vala scripts).

> vala-code: [ any vala code ] [ pp-condition ] [ any vala code ] pp-condition: #if pp-expression vala-code [ pp-elif ] [ pp-else ] #endif pp-elif: #elif pp-expression vala-code [ pp-elif ] pp-else: #else vala-code pp-expression: pp-or-expression pp-or-expression: pp-and-expression [ || pp-and-expression ] pp-and-expression: pp-binary-expression [ && pp-binary-expression ] pp-binary-expression: pp-equality-expression pp-inequality-expression pp-equality-expression: pp-unary-expression [ == pp-unary-expression ] pp-inequality-expression: pp-unary-expression [ != pp-unary-expression ] pp-unary-expression: pp-negation-expression pp-primary-expression pp-negation-expression: ! pp-unary-expression pp-primary-expression: pp-symbol ( pp-expression ) true false pp-symbol: identifier

The semantics of the preprocessor are very simple: if the condition is true then the Vala code surrounded by the preprocessor will be parsed, otherwise it will be ignored. A symbol evaluates to true if it is defined at compile-time. If a symbol in a preprocessor directive is not defined, it evaluates to false.

### 16.2 Defining symbols

It's not possible to define a preprocessor symbol inside the Vala code (like with C). The only way to define a symbol is to feed it through the `valac` option `-D`.

### 16.3 Built-in defines

Name | Description
POSIX | Set if the profile is posix
GOBJECT | Set if the profile is gobject
DOVA | Set if the profile is dova
VALA_X_Y | Set if Vala API version is equal or higher to version X.Y
DBUS_GLIB | Set if using dbus-glib-1 package

### 16.4 Examples

How to conditionally compile code based on a `valac` option `-D`.

Sample code:

    // Vala preprocessor example
    public class Preprocessor : Object {

        public Preprocessor () {
        }

        /* public instance method */
        public void run () {
    #if PREPROCESSOR_DEBUG
            // Use "-D PREPROCESSOR_DEBUG" to run this code path
            stdout.printf ("debug version \n");
    #else
            // Normally, we run this code path
            stdout.printf ("production version \n");
    #endif
        }

        /* application entry point */
        public static int main (string[] args) {
            var sample = new Preprocessor ();
            sample.run ();
            return 0;
        }
    }

#### Compile and Run

Normal build/run:

    $ valac -o preprocessor Preprocessor.vala
    $ ./preprocessor

Debug build/run:

    $ valac -D PREPROCESSOR_DEBUG -o preprocessor-debug Preprocessor.vala
    $ ./preprocessor-debug