如何在vala中使用和编译标准c Lib?

时间:2018-12-04 12:12:53

标签: gtk3 vala

我只是在vala中开始一些测试。 Vala对我来说是新的。当然,我开始阅读很多tuto,但是我不明白自己的错误。

如何使用和编译以下代码?

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

什么不好? 海湾合作委员会说

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 :(得分:2)

Vala生成C代码,但是您不能直接将C从Vala文件传递到生成的C。Vala [CCode]属性可以很好地控制生成的C,但是在大多数情况下您不需要案件。有关标准C名称及其GLib等效项的示例,请查看Vala存储库中的glib-2.0.vapi文件。其他标准C和POSIX扩展位于posix.vapi中。关于编写从Vala到C库的绑定也有深入的tutorial。但是,编写绑定是一个更高级的主题,您在示例中要实现的目标不需要新的绑定。

您的示例使用字符串插值。在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;
}