Escopo variável em C++
-
28-09-2019 - |
Pergunta
Se eu tivesse o seguinte código:
for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
int var2 = 16;
}
Então, depois escrevi o seguinte:
myvar = 0;
var2 = 0;
Isso seria legal?Meu VC++6 compila corretamente, mas acho que isso deveria ser ilegal.(Ocorre um erro de compilador em um dos meus outros compiladores.)
Solução
VC6 é bastante antigo e nem sempre ...rígido ...na aplicação do padrão :-) Na verdade vazou escopo em certas circunstâncias como:
for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.
Isto levou a alguns magia macro descolada para contornar esse problema.Se você estiver usando um compilador compatível com ISO, ambas as coisas que você tenta fazer são ilegais.
Da ISO C++11 3.3.3/1
, tratando da introdução do escopo de bloco com {...}
:
Um nome declarado em um bloco é local para esse bloco;tem escopo de bloco.Seu escopo potencial começa no ponto de declaração e termina no final do bloco.
Seção 6.5.3
cobre o escopo de variáveis "criadas" por um for
declaração:
Se o
for-init-statement
for uma declaração, o escopo do(s) nome(s) declarado(s) se estende até o final dofor-statement
.
Outras dicas
Não, não seria (§3.3.2 Escopo local):
- Um nome declarado em um bloco (6.3) é local para esse bloco. Seu escopo potencial começa em seu ponto de declaração (3.3.1) e termina no final de sua região declarativa.
Eu recomendo que você use compiladores lançados na última década.
Isso deve ser ilegal, mas o VC6 foi muito ruim nisso.
No Visual Studio 2005, uma nova configuração no nível do projeto foi introduzida nomeada "Força a conformidade no escopo do loop". Isso abordou o problema e também forneceu compatibilidade com versões anteriores. O que significa que as bases de código mais antigas podem compilar em versões mais recentes do Visual Studio através da desativação dessa configuração.
No entanto, uma coisa que a EM fez corretamente no VS2005 para ativar isso por padrão, portanto, chegando um pouco mais perto dos padrões.
Isso seria legal? Meu VC ++ 6 compila corretamente, mas acho que isso deve ser ilegal.
Não, não deveria ser legal. Dump vc ++ 6. Use um compilador novo e melhor.
O VC levou cerca de uma década para implementar o escopo adequado para variáveis declaradas em loops e instruções condicionais.Geralmente você não pode confiar no julgamento do VC6 em relação ao C++.