valac --vapi --internal-vapi --fast-vapi
valac --vapi --internal-vapi --fast-vapi
// 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'
- --vapi
valac --vapi=Point.vapi --library=point -X -shared Point.vala
:
// Point.vapi
namespace Test {
}
空...
- --内部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; }
}
}
它看起来很完美并且适合我
- --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吗?
您的 class 未指定其可见性,因此默认具有 "internal" 可见性。
这意味着它只对您命名空间内的其他 class 可见。
如果您将 class 指定为 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
将仅输出 public 类型并且 --internal-vapi
还将输出内部类型。
我不知道 --fast-vapi
是干什么用的。
关于你的第二个问题,你通常应该对共享库使用 public classes。内部与 public 可见性的重点在于 public 类型供 public(在命名空间之外)使用,而内部类型仅用于内部实现细节。
// 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'
- --vapi
valac --vapi=Point.vapi --library=point -X -shared Point.vala
:
// Point.vapi
namespace Test {
}
空...
- --内部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; }
}
}
它看起来很完美并且适合我
- --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吗?
您的 class 未指定其可见性,因此默认具有 "internal" 可见性。
这意味着它只对您命名空间内的其他 class 可见。
如果您将 class 指定为 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
将仅输出 public 类型并且 --internal-vapi
还将输出内部类型。
我不知道 --fast-vapi
是干什么用的。
关于你的第二个问题,你通常应该对共享库使用 public classes。内部与 public 可见性的重点在于 public 类型供 public(在命名空间之外)使用,而内部类型仅用于内部实现细节。