在 VAPI 绑定中声明一个新的枚举

Declaring a new enum in VAPI binding

我想在 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 使用我的新值而不是尝试引用那些未声明的值?

您可以使用 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 输出的可读性。