// 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'
valac --vapi=Point.vapi --library=point -X -shared Point.vala
:
// Point.vapi
namespace Test {
}
...空
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; }
}
}
它似乎很完美,适合我
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; }
}
}
这会在使用此vapi时引发错误error: External constants cannot use values
Q1 :确切的区别是什么?为什么有选择。
Q2 :为了创建共享库,我应该使用--internal-vapi吗?
答案 0 :(得分:3)
您的班级没有指定其可见性,因此它有"内部"默认情况下是可见的。
这意味着它只对您名称空间内的其他类可见。
如果您将该类指定为public,--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
的用途。
关于第二个问题,通常应该为共享库使用公共类。内部与公众可见性的关键在于公共类型是供公众使用(在命名空间之外),而内部类型仅用于内部实现细节。