Manmax
Manmax

Reputation: 181

How to use and compile standard c Lib in vala?

I'm just start few test in vala. Vala is new for me . Sure I started to read a lot of tuto, but I don't understand my mistake.

how to use and compile the follow code?

using Gtk;
#include <stdio.h>
// compile with  valac --pkg gtk+-3.0 hello_world_gtk_01.vala

public const int EXIT_SUCCESS=0;

int main (string[] args) 
{
    Gtk.init (ref args);

    var window = new Window ();
    window.title = "Hello, World!";
    window.border_width = 10;
    window.window_position = WindowPosition.CENTER;
    window.set_default_size (350, 70);
    window.destroy.connect (Gtk.main_quit);

    stdout.printf ("Version de gtk: %d.%d.%d\n", MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION);  
    stdout.printf ("Version de gtk: %u.%u.%u\n", get_major_version() , get_minor_version(), get_micro_version());   


    string  name, str;

    name = "Version de gtk: ";
    sprintf(str, "%d", get_major_version());
    name = name+ str;
    sprintf(str, "%d", get_minor_version());
    name = name+ str;
    sprintf(str, "%d", get_micro_version());
    name = name+ str+ "\n"; 

    var label = new Label (name);
    window.add (label);
    window.show_all ();

    Gtk.main ();
    return EXIT_SUCCESS;
}

What is bad ? Gcc said

hello_world_gtk_01.vala:2.2-2.9: error: syntax error, invalid preprocessing directive
#include <stdio.h>
 ^^^^^^^^
hello_world_gtk_01.vala:2.10-2.10: error: syntax error, expected identifier
#include <stdio.h>
         ^
Compilation failed: 2 error(s), 0 warning(s)

could you help me to understand how to manage stdio?

Upvotes: 0

Views: 620

Answers (1)

AlThomas
AlThomas

Reputation: 4289

Vala generates C code, but you can't pass C straight from the Vala file to the generated C. The Vala [CCode] attribute gives fine control over the generated C, but you won't need that in most cases. For an example of standard C names and their GLib equivalents take a look at the glib-2.0.vapi file in the Vala repository. Other standard C and POSIX extensions are in posix.vapi. There is also an in depth tutorial on writing a binding from Vala to a C library. Writing a binding, however, is a more advanced topic and what you are trying to achieve in your example doesn't need a new binding.

Your example uses string interpolation. In Vala a data type can have a method, so one way to write what you want would be:

name = "Version de gtk: %u.%u.%u\n".printf( get_major_version (), get_minor_version (), get_micro_version ());

Vala also has a string template syntax, @"", and and then an expression, $(), inside the string is evaluated. For example:

name = @"Version de gtk: $(get_major_version ()).$(get_minor_version ()).$(get_micro_version ())\n";

This works because uint, the return value of the function calls, has a to_string () method that is implicitly called by the string template.

Here's your example modified to use the string template method:

using Gtk;
// compile with  valac --pkg gtk+-3.0 hello_world_gtk_01.vala

public const int EXIT_SUCCESS=0;

int main (string[] args)
{
    Gtk.init (ref args);

    var window = new Window ();
    window.title = "Hello, World!";
    window.border_width = 10;
    window.window_position = WindowPosition.CENTER;
    window.set_default_size (350, 70);
    window.destroy.connect (Gtk.main_quit);

    stdout.printf ("Version de gtk: %d.%d.%d\n", MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION);
    stdout.printf ("Version de gtk: %u.%u.%u\n", get_major_version() , get_minor_version(), get_micro_version());


    var name = @"Version de gtk: $(get_major_version ()).$(get_minor_version ()).$(get_micro_version ())\n";

    var label = new Label (name);
    window.add (label);
    window.show_all ();

    Gtk.main ();
    return EXIT_SUCCESS;
}

Upvotes: 2

Related Questions