Oświadczenie goto nie może przekroczyć definicji zmiennej?
Załóżmy, że kod ten został skompilowanyg++
:
#include <stdlib.h>
int main() {
int a =0;
goto exit;
int *b = NULL;
exit:
return 0;
}
g++
rzuci błędy:
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’
Wygląda na to, żegoto
nie może przekraczać definicji wskaźnika, alegcc
kompiluje je, nic się nie skarży.
Po naprawieniu błędu musimy zadeklarować wszystkie wskaźniki przed którymkolwiek z nichgoto
oświadczenie, to znaczy, że musisz zadeklarować te wskaźniki, nawet jeśli nie potrzebujesz ich w chwili obecnej (i naruszenia niektórych zasad).
Co to za projekt pochodzeniag++
zabronione przydatneogon komunikat?
Aktualizacja:
goto
może przekraczać zmienną (dowolny typ zmiennej, nieograniczonej do wskaźnika) deklaracji,ale z wyjątkiem tych, które otrzymały wartość inicjalizacyjną. Jeśli usuniemyNULL
zadanie powyżej,g++
milcz teraz. Więc jeśli chcesz zadeklarować zmienne międzygoto
-przekrój,nie rób zainicjować je (i nadal naruszać niektóre zasady).