Как использовать и скомпилировать стандартный c lib в vala? - PullRequest
0 голосов
/ 04 декабря 2018

Я только начинаю несколько тестов в Вала.Вала для меня нова.Конечно, я начал читать много туто, но я не понимаю своей ошибки.

как использовать и скомпилировать следующий код?

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;
}

Что плохого?Gcc сказал

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)

Не могли бы вы помочь мне понять, как управлять stdio?

1 Ответ

0 голосов
/ 04 декабря 2018

Vala генерирует код C, но вы не можете передать C прямо из файла Vala в сгенерированный C. Атрибут Vala [CCode] дает точный контроль над сгенерированным C, но в большинстве случаев вам это не понадобится.Для примера стандартных имен C и их эквивалентов GLib посмотрите файл glib-2.0.vapi в хранилище Vala.Другие стандартные расширения C и POSIX находятся в posix.vapi .Существует также подробное руководство по написанию привязки из Vala к библиотеке C.Написание привязки, однако, является более сложной темой, и то, что вы пытаетесь достичь в своем примере, не требует новой привязки.

В вашем примере используется интерполяция строк.В Vala тип данных может иметь метод, поэтому одним из способов написать то, что вы хотите, будет:

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

В Vala также есть синтаксис строкового шаблона, @"", и изатем вычисляется выражение $() внутри строки.Например:

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

Это работает, потому что uint, возвращаемое значение вызова функции, имеет метод to_string (), который неявно вызывается строковым шаблоном.

Вот ваш пример, модифицированный для использования метода шаблона строки:

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;
}
...