2

土地

Valaは列挙を提供します。ただし、これらをサブプログラムに対してローカルで定義することはできません。定数はサブプログラムに対してローカルに定義できますが、静的式として扱われないようです(疑似定数もそうです)。

ケース

switchステートメントを使用して構築されたステートマシンとして実装されたサブプログラムがいくつかあります。のように、いくつかを使用し、ステートメントにswitch (state) { … }定数を使用したいと思います。これは、のようにリテラル定数を使用するよりも読みやすく、保守しやすいため、私が信じていることをお勧めします。casecase initial_state: { … }case 0: { … }

のような宣言を使用して、サブプログラム内でこれらの定数を定義しようとしましたconst int initial_state = 0;。しかし、ヴァラはそれぞれのケースステートメントで不平を言います。のように状態の列挙を定義しようとしましたenum State { initial_state, … };が、Valaはこれを構文エラーとして拒否し、サブプログラムの外部でのみ列挙宣言を許可しているようです。

これまでのところ、すべての状態列挙をサブプログラムの外部として定義するか、サブプログラム内の定数を定義する必要がありますが、条件式では問題ないため、if構成の代わりに構成を使用する必要があります。静的であること。switchif

質問

Valaは、何らかの方法でサブプログラムに対してローカルで(スカラー型の)静的定数を定義することを許可していますか?

4

1 に答える 1

3

これは実際にはvalacではなくgccからのエラーです。この例の使用:

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 に答える