Вопрос

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

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 локальный объем):

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

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

Это должно быть незаконным, но VC6 был очень плохим на этом.

В Visual Studio 2005 был представлен новый настроек уровня проекта «Соответствие форс в области спецификации». Отказ Это решало проблему и обеспечивала также обратную совместимость. Это означает, что более старые базы кода могут компилировать в более новых версиях Visual Studio с помощью отключения этой настройки.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top