valac --vapi --internal-vapi --fast-vapi

时间:2016-10-28 10:33:01

标签: vala 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'

  1. - VAPI
  2. valac --vapi=Point.vapi --library=point -X -shared Point.vala

    // Point.vapi
    namespace Test {
    }
    

    ...空

    1. - 内部VAPI
    2. 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. - 快速VAPI
      2. 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吗?

1 个答案:

答案 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的用途。

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