2010年8月24日 星期二

C語言的label

對於C的label 以前都只知道是與goto一起搭配使用, 使用方法如下

{
    int a = 1;
    int i = 0;
    for (i=1; i<10; i++)
    {
        if ((a % 5) == 0 )
            goto exit1;
        ++a;
    }
    goto exit2;
exit1:
    printf("a = %d\n", a);
    return a;
exit2:
    printf("a = %d\n", a);
    return a;
}
Label就是在程式中的某一段你想要goto到的點插入 "lable:", 然後就可以利用goto label; 來直接跳到那個地方. 不過後來發現還有另外一種宣告label的方式, 可以用來記錄label 的address, 然後可以在任何地方都直接跳到你要的點(需要同一個有效空間)
例子如下

int main(void)
{
       __label__ something; // something_1
       int foo;
       foo=0;
       char *ptr1 = &&something;  // *ptr 記錄了 something_1的位址, 此時goto *ptr1 == goto something;
       printf("%X\n", *ptr1);
       goto something;
       {
               __label__ something; // something_2
               char *ptr2 = &&something;
               printf("%X\n", *ptr2);
               goto something;
               something: // something_2
                       foo++;
       }
       something:    // something_1
               return foo;
}
上面例子可以發現,  label可以命名相同名字但必須在不同的scope裡面, 如果在內部scope想跳到外部scope的label則可以利用__label__的宣告來事先記錄下該label的address,  如 *ptr1


end.

1 則留言:

  1. 這是gnu c才有的,標準的iso c89或 c99都沒有。

    回覆刪除