【问题标题】:Declaring a new enum in VAPI binding在 VAPI 绑定中声明一个新的枚举
【发布时间】:2021-12-25 18:45:23
【问题描述】:

我想在 VAPI 文件中声明一个全新的枚举(而不是绑定到 C 枚举)。但是,当我写

[CCode (has_type_id = false)]
public enum EventKeyState {
    UP = 0,
    DOWN = 1,
    AUTOREPEAT = 2
}

并尝试使用值,Vala 尝试引用已经声明的值并在 C 编译器步骤中立即出错:

../tests/test_simple.vala: In function ‘_vala_main’:
../tests/test_simple.vala:7:21: error: ‘EVENT_KEY_STATE_UP’ undeclared (first use in this function)
    7 |         key.state = UP;
      |                     ^~~

如何解决这个问题,以便 Vala 将使用我的新值而不是尝试引用那些未声明的值?

【问题讨论】:

    标签: enums vala vapi


    【解决方案1】:

    您可以使用 CCode 属性将 C 中的一组整数分组为 Vala 枚举。将以下内容另存为example.vapi

    [CCode (has_type_id = false, cname = "int")]
    public enum EventKeyState {
        [CCode (cname = "0")]
        UP,
        [CCode (cname = "1")]
        DOWN,
        [CCode (cname = "2")]
        AUTOREPEAT 
    }
    
    

    然后将 Vala 程序保存为main.vala:

    void main () {
        EventKeyState a = DOWN;
    }
    

    编译这两个:

    valac example.vapi main.vala --ccode
    

    将生成main.c文件:

    static void _vala_main (void);
    
    static void
    _vala_main (void)
    {
        int a = 0;
        a = 1;
    }
    
    int
    main (int argc,
          char ** argv)
    {
        _vala_main ();
        return 0;
    }
    

    C 编译器将优化 a 的初始化和分配,尽管 Vala 编译器有一个参数来执行此操作以提高生成的 C 输出的可读性。

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多