Vala中的局部静态常量:可能吗?

时间:2013-02-20 08:03:30

标签: vala

土地

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

案例

我将一些子程序实现为使用switch语句构建的状态机。我使用了一些switch (state) { … },并希望为case语句使用一些常量,如case initial_state: { … }中所示。我相信这是推荐的,因为它比使用case 0: { … }中的文字常量更具可读性和可维护性。

我尝试使用const int initial_state = 0;之类的声明在子程序中定义这些常量。但Vala在每个案例陈述中抱怨。我尝试定义状态的枚举,如enum State { initial_state, … };中所示,但Vala拒绝这种语法错误,似乎只允许子程序之外的枚举声明。

到目前为止,我必须将所有状态枚举定义为子程序的外部,或者在子程序内定义常量,但是必须使用if构造而不是{{1}

问题

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

1 个答案:

答案 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 ...,如果你想玩它的话。)