C++ int я не объявлен в for()

Я конвертирую старый проект VC6 в VS2008, и по какой-то причине 2008 рассматривает int i как необъявленный, если он объявлен в файле for().

В коде они делают это много раз:

for(int i = 0; ... ; i++)

...

for(i = 0; ... ; i++)

if(i = RANDOM_NUMBER)

Это дает мне int i не объявленные ошибки, поэтому я должен поставить int i = 0 вверху каждого метода. Это можно обойти? Я не очень хорошо знаком с С++.


person Synaps3    schedule 13.01.2014    source источник
comment
Рад видеть, что Джерри Коффин действительно ответил на вопрос ниже.   -  person Joe    schedule 13.01.2014


Ответы (5)


Если вы просто хотите продолжать использовать код, не исправляя его, вы можете дать текущим компиляторам Microsoft переключатель -Zc:forScope-, чтобы заставить компилятор следовать правилам, которые были нормой несколько десятилетий назад (или около того).

Очевидно, я не могу гарантировать, что их компиляторы будут продолжать поддерживать это бесконечно, поэтому я по-прежнему считаю обновление этого кода довольно высокоприоритетным, но переключение компилятора позволит вам пока избежать этого, и назначать приоритет, а не требовать его немедленного исправления, чтобы вообще продолжать использовать код.

Интересное в стороне: компилятор в VC++ 6 был фактически способен следовать текущему правилу (но не по умолчанию). Однако на практике переключатель для обеспечения правильной области действия был непригоден, потому что многие (большинство?) стандартных заголовков, включенных в компилятор, зависели от нестандартного поведения, которое было отключено с помощью этого переключателя.

person Jerry Coffin    schedule 13.01.2014

Это раздражающая ошибка VC6. Если у вас много кода и вы предпочитаете не преобразовывать/исправлять, вы можете использовать специальные параметры компилятора, чтобы сохранить старое неправильное поведение.

См. /Ze статью о msdn.

Как указано в других ответах, это поведение не соответствует стандарту.

person ppl    schedule 13.01.2014

В старые времена C++ int, объявленный в for-цикле, определялся в блоке, охватывающем цикл. С введением стандарта C++ область переменных, объявленных внутри цикла, включая часть инициализации цикла for, ограничена циклом (то же самое касается операторов if, while и switch).

Есть два пути решения проблемы:

  1. Если вам нужно сохранить значение переменной, вы должны объявить ее перед оператором for:

    int i = 0;
    for (; ...; ++i) { ... }
    ...
    for (; ...; ++i) { ... }
    
  2. В противном случае вы просто объявите это снова:

    for (int i = 0; ...; ++i) { ... }
    ...
    for (int i = 0; ...; ++i) { ... }
    

Кроме того, я настоятельно рекомендую вам приобрести новейшее руководство по C++!

person Dietmar Kühl    schedule 13.01.2014

Переменные, объявленные внутри блока, больше не будут доступны вне блока.

{
    int i = 0;... 
} <-- i will not be accessesible outside this }

Точно так же цикл for представляет собой один блок, поэтому int i, объявленный в этом цикле for, не будет доступен за его пределами.

for(int i=0;..;..)
{
} //i will not be accessible after this.

Но если вы объявляете его над ним, его область действия будет другой, и вы можете получить к ней доступ в любое время в этой области.

int i=0;
for(i=0;..;..) <-- First for
{
}

for (i=0;..;..) <- Second for
{
}
person Digital_Reality    schedule 13.01.2014

ANSI C запрещает смешивать объявление и оператор, для этого вам нужно использовать стандарт C99. К сожалению, MS VS2008 не поддерживает C99, поэтому вы можете попробовать другой компилятор (например, Intel) или другую версию VS (я слышал, что VS2013 поддерживает стандарт C99, но не уверен).

person vershov    schedule 13.01.2014
comment
Его вопрос касается C++, а не C. Хотя содержащиеся в нем утверждения верны сами по себе, ваш ответ кажется не относящимся к рассматриваемому вопросу. - person Jerry Coffin; 13.01.2014
comment
Вопрос автора касается конкретной проблемы, а не языков. Проблема в том, что VS использует компилятор C (не C++) для обработки упомянутого кода. Очевидно, что проблема исчезнет при использовании компилятора C++. - person vershov; 13.01.2014
comment
Извините, но не. Проблема в том, что VC++ 6 (при компиляции C++) следовал правилу, которое устарело, даже когда оно было опубликовано (более 15 лет назад). По крайней мере, по умолчанию их компиляторы следуют текущему правилу (опять же, при компиляции C++). Попытка использовать for (int i ... вообще запрещена в C89, поэтому исправление, которое он использовал, тоже не сработает. - person Jerry Coffin; 13.01.2014
comment
C99 имеет ту же область видимости, что и C++, для переменных, объявленных в условном выражении. Переключение на компилятор C99 не заставит эту программу скомпилироваться, даже если она по совпадению не использует возможности C++. - person Casey; 13.01.2014