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