2

那片土地

Vala 提供枚举。但是这些不能在本地定义到子程序。常量可以在本地定义到子程序,但似乎不被视为静态表达式(伪常量如此)。

案子

我有一些子程序实现为使用switch语句构建的状态机。我使用一些switch (state) { … }并且想对case语句使用一些常量,如case initial_state: { … }. 我相信这是推荐的,因为它比在case 0: { … }.

我试图在子程序中定义这些常量,使用像const int initial_state = 0;. 但瓦拉对每个案例陈述都抱怨。我试图为状态定义一个枚举,如在 中enum State { initial_state, … };,但 Vala 拒绝这是一个语法错误,并且似乎只允许子程序之外的枚举声明。

到目前为止,我必须要么将所有状态枚举定义为子程序外部,要么在子程序内定义常量,但必须使用if构造而不是switch构造,因为if条件表达式可以,而不是是静态的。

问题

Vala 是否允许以某种方式在子程序本地定义静态常量(标量类型)?

4

1 回答 1

3

这实际上是 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 ...如果你想玩它)。

于 2013-02-20T13:00:00.413 回答