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 в началото на всеки метод. Има ли начин да се заобиколи това? Не съм много запознат със C++.


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