"for" workaround in MSVC
26 отговора
956 прегледа
"for" workaround in MSVC
Edin jak "tip" kak da reshim problema sus for i MSVC, kogato si definirame promenliva vutreshna za cikula:
Probvaite prednia primer sus #ifdef/#endif comentiran pod MSVC i shte dade greshka (MSVC 6.00)... Nie bjahme izbjagwali podobno neshto za nashia proekt - tuj kato kompilirahme i sus GCC i Metrowerks - no eto sega pak mozhe da se wurnem kum tazi praktika na izpolzwane na lokalni kum for-a promenlivi - blagodarenie na tova makrosche!

tirulirutatuutuu
// Microsoft Visual C/C++ 6.00 is not happy with for( int var ) used many times
#if defined(_MSC_VER)
#if 0
// Jack Matthews solution (jack at retrostudios dot com)
#define for switch(0) case 0: default: for
#else
// Andrew Davies solution (adavies at reflectionsinteractive dot com)
#define for if (0) ; else for
#endif
#endif
void foo( int i )
{
}
void bar( int i )
{
}
int main(int argc, char* argv[])
{
for ( int i = 0; i < 10; ++i )
foo(i);
for ( int i = 1; i < 10920; ++i )
bar(i);
return 0;
}
Probvaite prednia primer sus #ifdef/#endif comentiran pod MSVC i shte dade greshka (MSVC 6.00)... Nie bjahme izbjagwali podobno neshto za nashia proekt - tuj kato kompilirahme i sus GCC i Metrowerks - no eto sega pak mozhe da se wurnem kum tazi praktika na izpolzwane na lokalni kum for-a promenlivi - blagodarenie na tova makrosche!
tirulirutatuutuu
Re: "for" workaround in MSVC
ногу мерси!
почвам да го прилагам
комплексиран... като баба ти!!!
почвам да го прилагам
комплексиран... като баба ти!!!
Re: "for" workaround in MSVC
А какъв е точно проблема с вътрешните променливи, ако мога да запитам?
Я вышел им наперерез!
Я вышел им наперерез!
Re: "for" workaround in MSVC
Slednia kod
se kompilira dobre pod GCC, Metrowerks CodeWarrior (sigurno i drugi), no pod MSVC 6.00 ne shte... dobawjaneto na edin ot dvata macrosa podmenjashti "for" - opravja polozhenieto. Nalaga se ako imash goljam kod za portwane kum MSVC i ne ti se igrae da minawash nawsjakude i opravjash ruchno.
MSVC 6.00 smjata che ako imash for( int i; ... ; ... ) to i ne e lokalna za blocka izpulnjawasht se wuw for, a za blocka w kojto for se izpulnjawa -> w sluchaja kojto opisah tova e main().
Mislja che wuw MSVC 7.00 (.NET) tova e opraveno - no wse oshte hora polzwat i staria kompilator.
tirulirutatuutuu
void foo( int i )
{
}
void bar( int i )
{
}
int main(int argc, char* argv[])
{
for ( int i = 0; i < 10; ++i )
foo(i);
for ( int i = 1; i < 10920; ++i )
bar(i);
return 0;
}
se kompilira dobre pod GCC, Metrowerks CodeWarrior (sigurno i drugi), no pod MSVC 6.00 ne shte... dobawjaneto na edin ot dvata macrosa podmenjashti "for" - opravja polozhenieto. Nalaga se ako imash goljam kod za portwane kum MSVC i ne ti se igrae da minawash nawsjakude i opravjash ruchno.
MSVC 6.00 smjata che ako imash for( int i; ... ; ... ) to i ne e lokalna za blocka izpulnjawasht se wuw for, a za blocka w kojto for se izpulnjawa -> w sluchaja kojto opisah tova e main().
Mislja che wuw MSVC 7.00 (.NET) tova e opraveno - no wse oshte hora polzwat i staria kompilator.
tirulirutatuutuu
Re: "for" workaround in MSVC
Хм, ама това ми звучи логично.
В смисъл, че е правилно променливата да се счита за декларирана в контекста на функцията а не на цикъла.
Я вышел им наперерез!
В смисъл, че е правилно променливата да се счита за декларирана в контекста на функцията а не на цикъла.
Я вышел им наперерез!
Re: "for" workaround in MSVC
скоро имаше дискусия за това нещо тук -- доколкото си спомням, не става въпрос дали е логично или не -- просто стандарта така бил казвал.
да кажем, че майкрософт са решили да престанат да бъдат логични с версия 7 на компилатора си.
комплексиран... като баба ти!!!
да кажем, че майкрософт са решили да престанат да бъдат логични с версия 7 на компилатора си.
комплексиран... като баба ти!!!
Re: "for" workaround in MSVC
maj ne6to ne si w 4as....promenliwata trqbwa da e widima samo wyw scope kydeto e deklarirana
Re: "for" workaround in MSVC
#define for if(0);else for
Само че как ме погледнаха колегите като го видяха това е един header... :)
Иначе така трябва ако искаш да си ANSI C++ въвместим, обаче ако разчиташ на промеливата от цикъла след това като резултат (най-често след break), то е малко неприятно. Но се свиква.
Само че как ме погледнаха колегите като го видяха това е един header... :)
Иначе така трябва ако искаш да си ANSI C++ въвместим, обаче ако разчиташ на промеливата от цикъла след това като резултат (най-често след break), то е малко неприятно. Но се свиква.
Re: "for" workaround in MSVC
Иначе така трябва ако искаш да си ANSI C++ въвместим, обаче ако разчиташ на промеливата от цикъла след това като резултат (най-често след break), то е малко неприятно. Но се свиква.
ako razchitash na tova:
da raboti pod ne-MSVC6.00 kompilator - to po-dobre si popravi koda da ne razchita na takiva raboti: da kazhem taka:
dori w novoto MSVC7.00 / .NET - purwoto njama da se poddurzha.
Microsoft chesto ostavja horata w zabluda - smjataki che tehnia kompilator e naj-blizo do C/C++ standarta - no mai che e naj-daleche sprjamo suvremennite drugi kompilatori ;)
tirulirutatuutuu
ako razchitash na tova:
void func()
{
for( int i = 0; i< 1000; i++ )
printf("%d\n", i);
}
da raboti pod ne-MSVC6.00 kompilator - to po-dobre si popravi koda da ne razchita na takiva raboti: da kazhem taka:
void func()
{
int i;
for( i = 0; i< 1000; i++ )
printf("%d\n", i);
}
dori w novoto MSVC7.00 / .NET - purwoto njama da se poddurzha.
Microsoft chesto ostavja horata w zabluda - smjataki che tehnia kompilator e naj-blizo do C/C++ standarta - no mai che e naj-daleche sprjamo suvremennite drugi kompilatori ;)
tirulirutatuutuu
Re: "for" workaround in MSVC
ako razchitash neshto prechi li ti da napisesh
int i;
for ( i=0; i<n; i++)....
primerno
int i;
for ( i=0; i<n; i++)....
primerno
Re: "for" workaround in MSVC
Sorry, Malyk, ama aman ot hitrini kato tazi.
To zatowa powecheto kod prakticheski se poddyrza mnogo trudno, zashtoto razni mydreci sa nacvukali ej takiva "super cool" makroscheta, che naprawo ti se izprawja kosata.
To zatowa powecheto kod prakticheski se poddyrza mnogo trudno, zashtoto razni mydreci sa nacvukali ej takiva "super cool" makroscheta, che naprawo ti se izprawja kosata.
Re: "for" workaround in MSVC
Ne misja che si prav - ako imash da portnesh kod ot 1500 faila kum MSVC 6.00, kojto izpolzwa for po tozi nachin - shte e dosta po-riskowano ako trugnesh i izkarash wsichkite i-ta kato lokalni - trjabwa da si po-vnimatelen.
Naistina, takuv macros e za izbjagwane - no poradi chisto sueverni prichini. Da kazhem mozhe da rabotish s tozi macros w nachaloto na portwaneto, i sled tova leka po-leka - ekipa da prenapishe for-ovete - no ne wsichko otvednuzh. Osven tova ponjakoga e mnogo trudno da smenjash chuzhd sors - da kazhem takuv kojto ti idwa ot drugade, ili hedari....
tirulirutatuutuu
Naistina, takuv macros e za izbjagwane - no poradi chisto sueverni prichini. Da kazhem mozhe da rabotish s tozi macros w nachaloto na portwaneto, i sled tova leka po-leka - ekipa da prenapishe for-ovete - no ne wsichko otvednuzh. Osven tova ponjakoga e mnogo trudno da smenjash chuzhd sors - da kazhem takuv kojto ti idwa ot drugade, ili hedari....
tirulirutatuutuu
Re: "for" workaround in MSVC
citiram:
-----------------
Иначе така трябва ако искаш да си ANSI C++ въвместим, обаче ако разчиташ на промеливата от цикъла след това като резултат (най-често след break), то е малко неприятно. Но се свиква.
ako razchitash na tova:
void func()
{
for( int i = 0; i< 1000; i++ )
printf("%d\n", i);
}
----------
kakva mu e problemata na tova neshto?
pusnah si go na gcc i niama problem
bi imalo problem ako imashe vtori podoben for loop vav sushtata funkcia
popravi me ako gresha
-----------------
Иначе така трябва ако искаш да си ANSI C++ въвместим, обаче ако разчиташ на промеливата от цикъла след това като резултат (най-често след break), то е малко неприятно. Но се свиква.
ako razchitash na tova:
void func()
{
for( int i = 0; i< 1000; i++ )
printf("%d\n", i);
}
----------
kakva mu e problemata na tova neshto?
pusnah si go na gcc i niama problem
bi imalo problem ako imashe vtori podoben for loop vav sushtata funkcia
popravi me ako gresha
Re: "for" workaround in MSVC
ops!!!
imal sum wpredwid
greshka!
tirulirutatuutuu
imal sum wpredwid
void func()
{
for( int i = 0; i< 1000; i++ ) ;
printf("%d\n", i);
}
greshka!
tirulirutatuutuu
Хич не ти разбирам логиката
Ако една променлива ще се вижда извън оператора for, то логично е да бъде декларирана извън него. Явно си работил само на VC и това ти е изкривило мисленето. Аз лично като се сблъсках за пръв път с тази боза побеснях. И до сега не ползвам възможността да декларирам променливите в цикъла, а ги слагам преди него, точно както се виждат.
А Строуструп разправяше, че даже трябва да може да се дефинира променлива в условието на if и да си важи само в оператора, ама не съм го виждал никъде.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
А Строуструп разправяше, че даже трябва да може да се дефинира променлива в условието на if и да си важи само в оператора, ама не съм го виждал никъде.
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
А имаш ли представа къде са я скрили
тая опция по менютата? Щото съм я търсил, но не я открих. Или не са я изкарали там?
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_