我只是在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吗?
答案 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;
}