これらのコードが次のようにコンパイルされているとしg++
ます。
#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
宣言する必要があります。つまり、現時点では必要ない場合でも、これらのポインターを宣言する必要があります(一部の原則に違反します)。
有用なtail-gotoステートメントをg++
禁止した起源設計の考慮事項は何ですか?
アップデート:
goto
変数(ポインターに限定されない任意のタイプの変数)宣言をクロスできますが、初期化値を取得した宣言は除きます。NULL
上記の割り当てを削除する場合は、ここでg++
黙ってください。したがって、goto
-cross-area間で変数を宣言する場合は、それらを初期化しないでください(それでもいくつかの原則に違反します)。