2015年8月21日 星期五

Cross Initialization

今天和朋友聊到了會發生在Switch statement與goto statement的Cross Initialization問題。
switch (ch) {
    case 1:
        int jval = 1;
        break;
    case 2:
        jval = 2;
}
compile時會出現

error: crosses initialization of 'int jval'

然而只要改成
switch (ch) {
    case 1:
        int jval;
        break;
    case 2:
        jval = 2;
}
就不會出現error了
或者是使用block來限制變數的scope也可解決這問題。
switch (ch) {
    case 1: {
        int jval;
        break;
    }
    case 2: {
        jval = 2;
    }
}
去google了一下,stackoverflow有許多篇在介紹這個問題,似乎是compiler不允許在同一個scope中jump over initialization.

ISO C++ ‘03 6.7/3 有規範
It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an initializer (8.5)

還需要弄懂的是為什麼只有initialization被禁止(不只有explicit的使用initializer來init,default init和value init也都不行),但是卻可以做definition與assignment。