switch case 變數 問題

int abc();

main()

{

switch(2)

{

case 0:

static int a=0;

break;

case 1:

static int b=abc();

break;

case 2:

break;

}

}

auto 變數不給過是一定的,因為goto後或許變數還未初始.

但是static 是屬於編譯時期已初始(a),

或是一開始執行時才初始bss 變數(b),這2個靜態都有初始的動作

,所以有些編譯器會ok.ex: G++(linux)/DEV/comeau, 但是又有些

compiler不給過 ,可能還是認為變數宣告不可goto吧~~

想問可以過的那些編譯器是符合iso c++ 嗎 ? google 找了許久找不到

有關static 宣告在case中的情況, 這合乎標準嗎 !?

在此先謝謝.

2 Answers

Rating
  • Lv 7
    2 decades ago
    Favorite Answer

    照ANSI裡講微軟是正確的. 不過這沒有誰對誰錯啦. 都合乎標準啦你看到的錯誤是針對local 變數而設定的例:int main() {            switch (1)            {            case 0:                        int i = 0;                        break;            case 1:                        i = 1;                        break;            case 2:                        break;            }            return(1);}會產生兩個initialization錯誤. 如把case 2拿掉則變成一個錯誤. 若再把case 1拿掉就沒錯誤了. 是因為在switch裡宣告的變數可以在switch裡宣告過後用. 這就是為何你沒有”undefined variable”的錯誤. 但是如果你只在case 0裡設初定值的話那如果沒到case 0的話i就沒初定值. 所以是錯的. ANSI C++裡有講這是錯誤的. 以上規矩有人認為(GNU)只能適用在local 變數. 如果是static/global 變數的話就不適用了. 因為在ANSI的定義裡是按照local變數而定的. 而static變數跟local變數的性質又不同且ANSI裡沒講static變數這樣用是對是錯, 它只講變數這樣用是錯的. 所以有些compiler(GNU)允許而有些卻不準(VC++). 為何static變數跟local變數的性質不同呢? 因為static/global 變數 是在執行程式的一開始就宣告了. 例:int main() {            switch (1)            {            case 0:                        static int i = 0;                        break;            case 1:                        i = 1;                        break;            case 2:                        break;            }            return(1);}所以不管switch選哪一個case, i都會被設初定值. 所以應無錯誤.但因ANSI C++只講local 變數是錯誤的ANSI C++沒說static 變數不是錯誤的所以微軟就保守一點. 不管是local還是static. 都是錯誤的不知這樣講你聽懂不懂?

    2005-05-24 21:33:52 補充:

    不能用local是因為如果case 0沒執行那i就沒有被設初定值.

    如用static那i就會在執行程式時被設初定值.所以不管是哪個case,i都會被設初定值.

    這問題是在有無設初定值.因local不一定被設初定值所以出錯.而static一定會設初定值所以沒事.

  • Anonymous
    2 decades ago

     

    在switch中宣告一個static變數是可以的

     

    但這個變數離開switch後會自動死亡

     

Still have questions? Get your answers by asking now.