2013-02-20 29 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

相關問題