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

How to use and compile standard c Lib in vala?

我刚开始在 vala 中进行一些测试。 Vala 对我来说是新的。当然我开始读了很多教程,但我不明白我的错误。

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

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 吗?

Vala 生成 C 代码,但您不能将 C 直接从 Vala 文件传递​​到生成的 C。Vala [CCode] 属性可以很好地控制生成的 C,但您不需要它大多数情况下。有关标准 C 名称及其 GLib 等价物的示例,请查看 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 关于编写从 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,函数调用的 return 值,有一个 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;
}