Вопрос по MS VC++ 2005
От: SSN75  
Дата: 19.09.07 19:43
Оценка: -1
Добрый день!
Кто-нибудь может рассказать как в VC++ 2005 заставить работать код
который работает в VC++ 6.0:

BOOL Class::Func ()
{
for ( int i = 0; i < 5; i ++ )
if ( i == 1 )
break;
return ( i == 5 );
}

уж очень надаело объявлять переменные в начале функции, типа:

BOOL Class::Func ()
{
int i;
for ( i = 0; i < 5; i ++ )
if ( i == 1 )
break;
return ( i == 5 );
}

не С же в самом деле!
Re: Вопрос по MS VC++ 2005
От: VoidEx  
Дата: 19.09.07 20:33
Оценка:
Здравствуйте, SSN75, Вы писали:

SSN>Добрый день!

SSN>Кто-нибудь может рассказать как в VC++ 2005 заставить работать код

SSN>уж очень надаело объявлять переменные в начале функции, типа:


Ну формально Project -> Properties -> Configuration properties -> C/C++ -> Language -> Force Conformance In For Loop Scope = No
Но это не дело
С тех пор стандарт изменился чуток и объявленная таким образом переменная видна только внутри for.
Re[2]: Вопрос по MS VC++ 2005
От: ArtDenis Россия  
Дата: 20.09.07 03:34
Оценка:
Здравствуйте, VoidEx, Вы писали:
VE>С тех пор стандарт изменился чуток и объявленная таким образом переменная видна только внутри for.

Насколько я знаю, к стандарту это никакого отношения не имеет. Видимость переменной за пределами цикла это выкрутасы VC6
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Вопрос по MS VC++ 2005
От: CreatorCray  
Дата: 20.09.07 06:29
Оценка: -3
Здравствуйте, ArtDenis, Вы писали:

AD>Видимость переменной за пределами цикла это выкрутасы VC6

Впрочем, надо признать как оказалось довольно удобный и практичный выкрутас...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Вопрос по MS VC++ 2005
От: alzt  
Дата: 20.09.07 08:37
Оценка:
Здравствуйте, CreatorCray, Вы писали:

AD>>Видимость переменной за пределами цикла это выкрутасы VC6

CC>Впрочем, надо признать как оказалось довольно удобный и практичный выкрутас...

Я отлаживал программу (кажется уже VS2003). Долго не мог понять причину. Оказалось всё просто — я объявлял переменную в цикле и считал, что она имеет локальную область видимости, то есть за пределами цикла её не видно. Ниже использовалась другая переменная, её объявление было убрано на каком-то этапе, но я считал её за отдельную переменную. В результате было 2 переменных вместо одной.
Re: Вопрос по MS VC++ 2005
От: alzt  
Дата: 20.09.07 08:38
Оценка:
Здравствуйте, SSN75, Вы писали:

Если объявлять, то лучше так

SSN>BOOL Class::Func ()

SSN>{
SSN> int i =0;
SSN> for (; i < 5; i ++ )
SSN> if ( i == 1 )
SSN> break;
SSN> return ( i == 5 );
SSN>}
Re[5]: Вопрос по MS VC++ 2005
От: CreatorCray  
Дата: 20.09.07 09:17
Оценка: -2
Здравствуйте, alzt, Вы писали:

AD>>>Видимость переменной за пределами цикла это выкрутасы VC6

CC>>Впрочем, надо признать как оказалось довольно удобный и практичный выкрутас...

A>Я отлаживал программу (кажется уже VS2003). Долго не мог понять причину. Оказалось всё просто — я объявлял переменную в цикле и считал, что она имеет локальную область видимости, то есть за пределами цикла её не видно. Ниже использовалась другая переменная, её объявление было убрано на каком-то этапе, но я считал её за отдельную переменную. В результате было 2 переменных вместо одной.


Если лично вам это не удобно, то это совершенно не означает что это может быть удобно кому то другому.
Это относится и ко всем "несогласным". Я лично рад тому, что этот баг поддерживается большим кол-вом компиляторов, т.к. зачастую то, что объявленная переменная видна после for выходит более удобно и продуктивно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Вопрос по MS VC++ 2005
От: remark Россия http://www.1024cores.net/
Дата: 20.09.07 09:24
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, VoidEx, Вы писали:

VE>>С тех пор стандарт изменился чуток и объявленная таким образом переменная видна только внутри for.

AD>Насколько я знаю, к стандарту это никакого отношения не имеет. Видимость переменной за пределами цикла это выкрутасы VC6


Дело в том, что до определенного момента VC и Стандарт Языка С++ были фактически синонимами


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Вопрос по MS VC++ 2005
От: SSN75  
Дата: 20.09.07 16:59
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Ну формально Project -> Properties -> Configuration properties -> C/C++ -> Language -> Force Conformance In For Loop Scope = No

VE>Но это не дело
VE>С тех пор стандарт изменился чуток и объявленная таким образом переменная видна только внутри for.

Фуууу! Спасиба большое...
Re[2]: Вопрос по MS VC++ 2005
От: SSN75  
Дата: 20.09.07 17:13
Оценка:
Здравствуйте, VoidEx, Вы писали:

VE>Ну формально Project -> Properties -> Configuration properties -> C/C++ -> Language -> Force Conformance In For Loop Scope = No


Спасиба большое!
А может еще подскажете как решить:

пусть есть Solution из 10 проектов;
каждый проект инклудит один и тот же header в котором есть строка вида:

#define XXX 5

теперь если сделать поиск:
Find what:
XXX
Look in:
Entire Solution

то:

MSVS 2005
на закладке поиска, например, Find Results 1 будет 10 ( десять ) результатов поиска
правда все они будут в одном и том же файле в одном и том же месте ( в общем htader-е )

MSVS 6.0
на закладке поиска, например, Find Results 1 будет 1 ( один ) результат поиска
( в общем htader-е )

хочется как в шестерке... очень...
Re[3]: Вопрос по MS VC++ 2005
От: SSN75  
Дата: 20.09.07 17:20
Оценка:
SSN>хочется как в шестерке... очень...

походу наврал насчет 10...

тем не менее смысл хотения:
исключить повторяющиеся результаты поиска.
Re[2]: Вопрос по MS VC++ 2005
От: pasenger  
Дата: 01.10.07 06:19
Оценка:
а инкрементить так ++i
и вообще
BOOL Class::Func ()
{ 
  for (int i =0; i < 5; ++i )
    if ( i == 1 )
      return false;
  return true;
}
Re[4]: Вопрос по MS VC++ 2005
От: Bell Россия  
Дата: 01.10.07 07:33
Оценка:
Здравствуйте, SSN75, Вы писали:

SSN>>хочется как в шестерке... очень...


SSN>походу наврал насчет 10...


SSN>тем не менее смысл хотения:

SSN>исключить повторяющиеся результаты поиска.

используй при поиске не "Entire Solution", а папку, которая содержит все твои проекты.
В Vc6 при поиске задается именно папка.
Любите книгу — источник знаний (с) М.Горький
Re[6]: Вопрос по MS VC++ 2005
От: Кодт Россия  
Дата: 01.10.07 09:08
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Если лично вам это не удобно, то это совершенно не означает что это может быть удобно кому то другому.

CC>Это относится и ко всем "несогласным". Я лично рад тому, что этот баг поддерживается большим кол-вом компиляторов, т.к. зачастую то, что объявленная переменная видна после for выходит более удобно и продуктивно.

Тем не менее, это баг. Программы, эксплуатирующие его, становятся непортабельными (вплоть до того, что не выдерживают апгрейд компилятора).
Причём, при удачном стечении обстоятельств, программа может остаться компилируемой — хотя поведение её будет кардинально иным. Можете поэкспериментировать с /Zc:forScope±
#include <iostream>
using namespace std;

int i = 12345;
int main()
{
    cout << "before loop: " << i << endl;

    for(int i=0; i!=10; ++i)
        cout << "within loop: " << i << endl;

    cout << "after loop: " << i << endl;
}


А для тех, кому нужно именно такое поведение, которое присуще VC6 — пожалуйста, кто мешает
#include <iostream>
using namespace std;

int i = 12345;
int main()
{
    cout << "before loop: " << i << endl;

    int i;
    for(i=0; i!=10; ++i)
        cout << "within loop: " << i << endl;

    cout << "after loop: " << i << endl;
}
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.