2
// Point.vala
namespace Test {
    class Point {
        public const int MY_CONST = 123;
        public float x { get; set; }
        public float y { get; set; }
    }
}

有一个 vala 源文件,'Point.vala'

  1. --vapi

valac --vapi=Point.vapi --library=point -X -shared Point.vala

// Point.vapi
namespace Test {
}

空的...

  1. --内部-vapi

valac --internal-vapi=Point.vapi --header=Point.h --internal-header=Point_internal.h --library=point -X -shared Point.vala

// Point.vapi
namespace Test {
    [CCode (cheader_filename = "Point_internal.h")]
    internal class Point {
        public const int MY_CONST;
        public Point ();
        public float x { get; set; }
        public float y { get; set; }
    }
}

它看起来很完美,对我有用

  1. --fast-vapi

valac --fast-vapi=Point.vapi --library=point -X -shared Point.vala

// Point.vapi
using GLib;
namespace Test {
    internal class Point {
        public const int MY_CONST = 123; // error
        public Point ();
        public float x { get; set; }
        public float y { get; set; }
    }
}

error: External constants cannot use values使用此 vapi 时,这会引发错误

Q1:确切的区别是什么?以及为什么有这些选项。

Q2 : 为了创建共享库,我应该使用 --internal-vapi 吗?

4

1 回答 1

3

您的班级没有指定其可见性,因此默认情况下它具有“内部”可见性。

这意味着它只对命名空间内的其他类可见。

如果您将类指定为公共,则--vapi开关将按预期输出一个 vapi 文件:

// Point.vala
namespace Test {
    // Make it public!
    public class Point {
        public const int MY_CONST = 123;
        public float x { get; set; }
        public float y { get; set; }
    }
}

调用:

valac --vapi=Point.vapi --library=point -X -shared Point.vala

结果:

/* Point.vapi generated by valac.exe 0.34.0-dirty, do not modify. */

namespace Test {
        [CCode (cheader_filename = "Point.h")]
        public class Point {
                public const int MY_CONST;
                public Point ();
                public float x { get; set; }
                public float y { get; set; }
        }
}

因此--vapi将仅输出公共类型,并且--internal-vapi还将输出内部类型。

我不知道--fast-vapi是为了什么。

至于您的第二个问题,您通常应该将公共类用于共享库。内部与公共可见性的重点在于,公共类型是供公众(在命名空间之外)使用的,而内部类型仅用于内部实现细节。

于 2016-10-28T11:03:10.647 回答