Переменная Область в C ++ - PullRequest
9 голосов
/ 02 ноября 2010

Если бы у меня был следующий код:

for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
    int var2 = 16;
}

Затем, потом я написал следующее:

myvar = 0;
var2 = 0;

Это будет законно? Мой VC ++ 6 компилирует его правильно, но я думаю, что это должно быть незаконно. (Это дает ошибку компилятора в одном из моих других компиляторов.)

Ответы [ 5 ]

17 голосов
/ 02 ноября 2010

Нет, не будет (§3.3.2 Локальная область):

  1. Имя, объявленное в блоке (6.3), является локальным для этого блока. Его потенциал сфера начинается в своей точке декларация (3.3.1) и заканчивается на конец его декларативного региона.

Я рекомендую вам использовать компиляторы, выпущенные в последнее десятилетие.

10 голосов
/ 02 ноября 2010

VC6 довольно старый, и не всегда ... жесткий ... в применении стандарта :-) На самом деле утечка область применения в определенных обстоятельствах, таких как:

for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.

Это привело к некоторой прикольной макро магии , чтобы обойти эту проблему.Если вы используете ISO-совместимый компилятор, обе эти попытки являются недопустимыми.

Начиная с ISO C ++ 11 3.3.3/1, касаясь введения области видимости блока с {...}:

Имя, объявленное в блоке, является локальным для этого блока;у него есть область видимости блока.Его потенциальная область действия начинается в точке объявления и заканчивается в конце его блока.

Раздел 6.5.3 охватывает область действия переменных, «созданных» оператором for:

Если for-init-statement является объявлением, область действия объявленного имени (имен) распространяется на конец for-statement.

4 голосов
/ 02 ноября 2010

Это должно быть недопустимо, но VC6 был очень плох.

В Visual Studio 2005 был введен новый параметр уровня проекта с именем "Принудительное соответствие в For-loop Scope" ,Это решило проблему и обеспечило обратную совместимость.Это означает, что более старые базы кода могут компилироваться в более новых версиях Visual Studio, если отключить этот параметр.

Тем не менее, одна вещь, которую MS сделала правильно в VS2005, чтобы включить ее по умолчанию, поэтому немного приблизилась кстандарты.

1 голос
/ 02 ноября 2010

VC потребовалось около десяти лет, чтобы реализовать правильную область видимости для переменных, объявленных в циклах и условных выражениях. Как правило, вы не можете полагаться на мнение VC6 относительно C ++.

1 голос
/ 02 ноября 2010

Это будет законно?Мой VC ++ 6 компилирует его правильно, но я думаю, что это должно быть незаконно.

Нет, это не должно быть законно.Дамп VC ++ 6.Используйте новый и лучший компилятор.

...