Vala提供了枚举。但这些不能在本地定义为子程序。常量可以在本地定义到子程序,但似乎不被视为静态表达式(伪常量)。
我将一些子程序实现为使用switch
语句构建的状态机。我使用了一些switch (state) { … }
,并希望为case
语句使用一些常量,如case initial_state: { … }
中所示。我相信这是推荐的,因为它比使用case 0: { … }
中的文字常量更具可读性和可维护性。
我尝试使用const int initial_state = 0;
之类的声明在子程序中定义这些常量。但Vala在每个案例陈述中抱怨。我尝试定义状态的枚举,如enum State { initial_state, … };
中所示,但Vala拒绝这种语法错误,似乎只允许子程序之外的枚举声明。
到目前为止,我必须将所有状态枚举定义为子程序的外部,或者在子程序内定义常量,但是必须使用if
构造而不是{{1} 1}}条件表达式可以构造为不是静态的。
Vala是否允许以某种方式在本地为子程序定义静态常量(标量类型)?
答案 0 :(得分:2)
这实际上是gcc的错误,而不是valac。使用这个例子:
private void foo (int val) {
const int one = 1;
const int two = 2;
const int three = 3;
switch ( val ) {
case one:
GLib.debug ("One");
break;
case two:
GLib.debug ("One");
break;
case three:
GLib.debug ("Three");
break;
default:
GLib.debug (val.to_string ());
break;
}
}
valac将生成:
void foo (gint val) {
static const gint one = 1;
static const gint two = 2;
static const gint three = 3;
gint _tmp0_;
_tmp0_ = val;
switch (_tmp0_) {
case one:
{
g_debug ("t.vala:8: One");
break;
}
case two:
{
g_debug ("t.vala:11: One");
break;
}
case three:
{
g_debug ("t.vala:14: Three");
break;
}
default:
{
gint _tmp1_;
gchar* _tmp2_ = NULL;
gchar* _tmp3_;
_tmp1_ = val;
_tmp2_ = g_strdup_printf ("%i", _tmp1_);
_tmp3_ = _tmp2_;
g_debug ("t.vala:17: %s", _tmp3_);
_g_free0 (_tmp3_);
break;
}
}
}
gcc会说:
t.vala.c:25:3: error: case label does not reduce to an integer constant
t.vala.c:30:3: error: case label does not reduce to an integer constant
t.vala.c:35:3: error: case label does not reduce to an integer constant
有趣的是,clang对它很好(valac --cc=clang ...
,如果你想玩它的话。)