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.)

Foi útil?

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 do for-statement.

Outras dicas

Não, não seria (§3.3.2 Escopo local):

  1. 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++.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top