ContentsVala Reference Manual

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




Set if the profile is posix


Set if the profile is gobject


Set if the profile is dova


Set if Vala API version is equal or higher to version X.Y


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 () {
        // Use "-D PREPROCESSOR_DEBUG" to run this code path
        stdout.printf ("debug version \n");
        // Normally, we run this code path
        stdout.printf ("production version \n");

    /* application entry point */
    public static int main (string[] args) {
        var sample = new Preprocessor (); ();
        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