如何在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;
}
我刚开始在 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;
}