これらのコードが次のようにコンパイルされているとし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間で変数を宣言する場合は、それらを初期化しないでください(それでもいくつかの原則に違反します)。