【问题标题】:Vala: Understanding Struct Properties in ClassesVala:了解类中的结构属性
【发布时间】:2016-12-19 21:43:25
【问题描述】:

我目前正在通过https://wiki.gnome.org/Projects/Vala/Tutorial 的 Vala 教程进行学习。现在我偶然发现了一个需要进一步解释的部分;在本教程最后的对象属性部分中,介绍了结构属性。给出了一个示例来说明如何检索此类属性:

struct Color
{
    public uint32 argb;

    public Color() { argb = 0x12345678; }
}

class Shape: GLib.Object
{
    public Color c { get; set; default = Color(); }
}

int main()
{
    Color? c = null;
    Shape s = new Shape();
    s.get("c", out c);
}

教程指出:“这样,c 是一个引用而不是堆栈上的颜色实例。您传递给s.get() 的是Color ** 而不是Color *.

我的问题是关于上面的陈述。首先,有人可以详细说明“你传递给s.get()的是Color **而不是Color *.”是什么意思。另外,这是否意味着以下内容

int main()
{
    Shape s = new Shape();
    Color c = s.c;
}

导致s.c 被分配给c

编辑:我在valac -C structs.vala 中运行了上面的示例。 main 方法的相关 C 等效项是

gint _vala_main (void) {
    gint result = 0;
    Color* c = NULL;
    Shape* s = NULL;
    Shape* _tmp0_ = NULL;
    c = NULL;
    _tmp0_ = shape_new ();
    s = _tmp0_;
    g_object_get ((GObject*) s, "c", &c, NULL);
    result = 0;
    _g_object_unref0 (s);
    _color_free0 (c);
    return result;
}

【问题讨论】:

    标签: vala


    【解决方案1】:

    valac 将 Vala 代码编译成 C 代码,然后由 C 编译器(通常是 GCC)编译成目标格式(例如目标文件、库或可执行文件)。

    所以本教程所说的Color** 是指生成的C 代码会将pointer to a pointer to a Color struct 传递给函数(在生成的C 代码中是gobject_get)。

    结构是 C 和 Vala* 中的值类型,这意味着它们的所有内存都在赋值时被复制。 Vala 中的 Color?nullable Color)等价于 C 中的 Color*pointer to Color)。

    Vala 也将 refout 参数转换为 C 中的指针,因此当使用可空结构变量调用 outref 参数时,您会得到一个双指针 (pointer to a pointer)。

    C 的类型不如 Vala 强,这就是很多 Vala 结构最终成为 C 中的指针的原因。C 使用指针来声明可选事物、引用、引用调用参数、数组/字符串、链表以及其他一些更晦涩的东西(如函数指针和泛型)。

    关于你的第二个问题:直接分配给结构变量时会复制*。

    *See this question with a great answer by AlThomas 解释何时在 Vala 和 C 级别进行复制。

    【讨论】:

    • 非常感谢您提供如此详尽的答案以及您提供的参考。值得我将编译后的 C 输出添加到我的问题中;显然,颜色指针 c 作为引用传递:g_object_get ((GObject*) s, "c", &c, NULL);
    • 好的,在这种情况下,编译器似乎比我最初想象的要聪明。无论如何,在寻找这样的东西时使用-C 是一个好主意:)。
    猜你喜欢
    • 2019-09-13
    • 2015-07-27
    • 1970-01-01
    • 2014-03-30
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多