在 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 输出的可读性。
我想在 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 输出的可读性。