對於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.
這是gnu c才有的,標準的iso c89或 c99都沒有。
回覆刪除