Предположим, что этот код скомпилирован в 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
, то есть вы должны объявить эти указатели, даже если они вам не нужны в настоящее время (и нарушение с некоторыми принципами).
Какое предположение о начале проекта, что g++
запрещает полезную инструкцию tail-goto?
Update:
goto
может пересекать переменную (любой тип переменной, не ограничиваясь указателем), но за исключением тех, которые получили значение инициализации. Если мы удалим назначение NULL
выше, g++
сейчас молчать. Поэтому, если вы хотите объявить переменные между goto
-cross-area, не инициализируйте их (и по-прежнему нарушайте некоторые принципы).