"for" workaround in MSVC

26 отговора 956 прегледа
#1

"for" workaround in MSVC

Edin jak "tip" kak da reshim problema sus for i MSVC, kogato si definirame promenliva vutreshna za cikula:


// 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
Отговор
в отговор на malkia #2

Re: "for" workaround in MSVC

WTFIYPM

Отговор
в отговор на Stoev #3

Re: "for" workaround in MSVC

DTIBWGZ, AMA WTFIT?

tirulirutatuutuu
Отговор
в отговор на malkia #4

Re: "for" workaround in MSVC

ногу мерси!

почвам да го прилагам

комплексиран... като баба ти!!!
Отговор
в отговор на malkia #5

Re: "for" workaround in MSVC

А какъв е точно проблема с вътрешните променливи, ако мога да запитам?

Я вышел им наперерез!
Отговор
в отговор на Resurrector #6

Re: "for" workaround in MSVC

Slednia kod


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
Отговор
в отговор на malkia #7

Re: "for" workaround in MSVC

Хм, ама това ми звучи логично.
В смисъл, че е правилно променливата да се счита за декларирана в контекста на функцията а не на цикъла.

Я вышел им наперерез!
Отговор
в отговор на Resurrector #8

Re: "for" workaround in MSVC

скоро имаше дискусия за това нещо тук -- доколкото си спомням, не става въпрос дали е логично или не -- просто стандарта така бил казвал.

да кажем, че майкрософт са решили да престанат да бъдат логични с версия 7 на компилатора си.

комплексиран... като баба ти!!!
Отговор
в отговор на Resurrector #9

Re: "for" workaround in MSVC

maj ne6to ne si w 4as....promenliwata trqbwa da e widima samo wyw scope kydeto e deklarirana

Отговор
в отговор на malkia #10

Re: "for" workaround in MSVC

#define for if(0);else for

Само че как ме погледнаха колегите като го видяха това е един header... :)
Иначе така трябва ако искаш да си ANSI C++ въвместим, обаче ако разчиташ на промеливата от цикъла след това като резултат (най-често след break), то е малко неприятно. Но се свиква.

Отговор
в отговор на EvilProgrammer #11

Re: "for" workaround in MSVC

Иначе така трябва ако искаш да си ANSI C++ въвместим, обаче ако разчиташ на промеливата от цикъла след това като резултат (най-често след break), то е малко неприятно. Но се свиква.

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
Отговор
в отговор на EvilProgrammer #12

Re: "for" workaround in MSVC

ako razchitash neshto prechi li ti da napisesh
int i;
for ( i=0; i<n; i++)....
primerno

Отговор
в отговор на emo #13

Re: "for" workaround in MSVC

Примерно - не. Ама требе да се пише допълнително...

Отговор
в отговор на malkia #14

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.

Отговор
в отговор на Gonzu #15

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
Отговор
в отговор на malkia #16

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

Отговор
в отговор на nickita_ #17

Re: "for" workaround in MSVC

ops!!!
imal sum wpredwid


void func()
{
for( int i = 0; i< 1000; i++ ) ;
printf("%d\n", i);
}


greshka!

tirulirutatuutuu
Отговор
в отговор на Resurrector #18

Хич не ти разбирам логиката

Ако една променлива ще се вижда извън оператора for, то логично е да бъде декларирана извън него. Явно си работил само на VC и това ти е изкривило мисленето. Аз лично като се сблъсках за пръв път с тази боза побеснях. И до сега не ползвам възможността да декларирам променливите в цикъла, а ги слагам преди него, точно както се виждат.
А Строуструп разправяше, че даже трябва да може да се дефинира променлива в условието на if и да си важи само в оператора, ама не съм го виждал никъде.


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор
в отговор на malkia #19

za kvo e tova?

MSVC ima option /Za koito pravi tova koeto ti trjabva

Отговор
в отговор на CL #20

А имаш ли представа къде са я скрили

тая опция по менютата? Щото съм я търсил, но не я открих. Или не са я изкарали там?


System Doctor Error:
Your girlfriend is pregnant.
(A)bort, (M)arry, (I)gnore?_
Отговор