假設這些代碼在編譯g++
:聲明goto不能跨越變量定義?
#include <stdlib.h>
int main() {
int a =0;
goto exit;
int *b = NULL;
exit:
return 0;
}
g++
會引發錯誤:
goto_test.c:10:1: error: jump to label ‘exit’ [-fpermissive]
goto_test.c:6:10: error: from here [-fpermissive]
goto_test.c:8:10: error: crosses initialization of ‘int* b’
好像該goto
不能交叉指針的定義,但gcc
編譯他們好了,沒有什麼抱怨。
修正了錯誤之後,我們必須在任何goto
語句之前聲明所有指針,也就是說即使您目前不需要它們(以及違反某些原則),也必須聲明這些指針。
g++
禁止有用的原產地設計考慮tail-goto聲明?
更新:
goto
可以穿過變量(變量,不限於指針的任何類型的)聲明,但除了那些有一個初始化值。如果我們刪除上面的NULL
作業,g++
現在保持沉默。所以如果你想聲明goto
-交叉區域之間的變量,不要對它們進行初始化(並且仍然違反了一些原則)。