2013-02-20 17 views
0

土地

Vala提供了枚举。但是这些不能在本地定义为子程序。常量可以在本地定义为子程序,但似乎不被视为静态表达式(所以伪常量)。Vala中的局部静态常量:可能吗?

的情况下

我与switch陈述内置状态机来实现一些子方案。我使用了一些switch (state) { … },并且想要为case语句使用一些常量,如case initial_state: { … }。这是我相信的建议,因为它比使用case 0: { … }中的文字常量更具可读性和可维护性。

我试图用const int initial_state = 0;这样的声明在子程序中定义这些常量。但是Vala在每个案例陈述中都抱怨。我试图为这些状态定义一个枚举,如enum State { initial_state, … };,但Vala拒绝这是一个语法错误,并且似乎只允许子程序之外的枚举声明。到目前为止,我必须将所有状态枚举定义为子程序的外部,否则要定义子程序中的常量,但必须使用if结构,而不是switch结构,因为它可以条件表达式为if,不是静态的。

问题

待办事项瓦拉允许定义静态常量(的标量型)在当地以某种方式子计划?

回答

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; 
    } 
} 

华劣克将产生:

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 

有趣的是,铛是与它的罚款(valac --cc=clang ...,如果你要玩用它)。

+0

何,我错过了,我没有注意到这条消息来自海湾合作委员会(将有另一个看看它)。所以如果我理解正确,我想我应该提交一份报告? – Hibou57 2013-02-20 13:02:11

+0

我真的不知道它是否是一个错误。在这里,clang似乎比gcc更宽容,但gcc可能更严格地遵循标准。 – nemequ 2013-02-20 13:11:29

+0

好吧,我会尝试将它作为LaunchPad中的Vala中的错误提交(也可能是C代中的错误),然后查看他们对此案的看法。他们可能会想出什么应该是正确的解释。 – Hibou57 2013-02-20 13:21:06

相关问题