Переменная область в C ++
-
28-09-2019 - |
Вопрос
Если бы у меня был следующий код:
for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
int var2 = 16;
}
Затем я написал следующее:
myvar = 0;
var2 = 0;
Это будет законно? Мой VC ++ 6 правильно компилирует его, но я думаю, что это должно быть незаконным. (Это дает ошибку компилятора в одном из моих других компиляторов.)
Решение
VC6 довольно старый, а не всегда ... жесткий ... в своем применении стандарта :-) это на самом деле утечка Область применения в определенных обстоятельствах, таких как:
for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.
Это привело к некоторым Funky Macro Magic чтобы обойти эту проблему. Если вы используете ISO-соответствующий компилятор, оба те вещи, которые вы пытаетесь сделать, являются незаконными.
От ISO C ++ 11 3.3.3/1
, занимаясь внедрением блока с использованием {...}
:
Имя, объявленное в блоке, является локальным в этом блоке; Он имеет блок сферы. Его потенциальная область применения начинается на его точке декларации и заканчивается в конце его блока.
Раздел 6.5.3
покрывает объем переменных «создан» for
утверждение:
Если то
for-init-statement
Является ли декларация, объем названия (ы) объявлен продлен до концаfor-statement
.
Другие советы
Нет, это не было бы (§3.3.2 локальный объем):
- Имя, объявленное в блоке (6.3), является локальным для этого блока. Его потенциальная область начнется на своей точке декларации (3.3.1) и заканчивается в конце его декларативного региона.
Я рекомендую вам использовать компиляторы, выпущенные в последнее десятилетие.
Это должно быть незаконным, но VC6 был очень плохим на этом.
В Visual Studio 2005 был представлен новый настроек уровня проекта «Соответствие форс в области спецификации». Отказ Это решало проблему и обеспечивала также обратную совместимость. Это означает, что более старые базы кода могут компилировать в более новых версиях Visual Studio с помощью отключения этой настройки.
Тем не менее, одно, что MS правильно в VS2005, чтобы по умолчанию по умолчанию понять, что немного ближе к стандартам.
Это будет законно? Мой VC ++ 6 правильно компилирует его, но я думаю, что это должно быть незаконным.
Нет, это не должно быть законным. Дамп VC ++ 6. Используйте новый и лучший компилятор.
VC потребовалось около десятилетия для реализации надлежащего объема для переменных, объявленных в циклах и условных операторах. Как правило, вы не можете полагаться на суждение VC6 в отношении C ++.