Declaração goto não pode cruzar a definição de variáveis?
Suponha que esse código compilado emg++
:
#include <stdlib.h>
int main() {
int a =0;
goto exit;
int *b = NULL;
exit:
return 0;
}
g++
irá lançar erros:
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’
Parece que ogoto
não pode cruzar a definição de ponteiro, masgcc
compila-os ok, nada reclamou.
Depois de corrigir o erro, devemos declarar todos os ponteiros antes de qualquer um dosgoto
declaração, isto é, você deve declarar esses ponteiros mesmo que você não precise deles no presente (e violação com alguns princípios).
Qual a consideração de design de origem queg++
proibido o útilcauda-goto declaração?
Atualizar:
goto
pode cruzar variáveis (qualquer tipo de variável, não limitado a ponteiro) declaração,mas exceto aqueles que obtiveram um valor de inicialização. Se removermos oNULL
atribuição acima,g++
fique em silêncio agora. Então, se você quiser declarar variáveis entregoto
-cross área,não inicializá-los (e ainda violar alguns princípios).