Sichtbarkeit von i ausserhalb von "for (int i=0;...){...}"
-
Ich arbeite mit Visual C++ 6.0 und möchte das der Compiler
es als Fehler ansieht wenn ich ausserhalb einer for-schleife auf eine in einer for-schleife angelegten lokalen Variablen zugreife.
Bsp:...
for(int i=0; i<4;i++) { } i=2 // hier sollte der Debugger doch eigentlich meckern wenn er ANSI-konform ist
wäre (nebenbei:Java z.B. weist das auch sofort ab)
statt dessen muss ich explizit klammern
[cpp]
{for(int i=0; i<4;i++)
{
}}
i=2 // jetzt kommt eine Fehlermeldung
[/cpp]
damit er es als Fehler ansieht.Gibt es dafür einen Compiler-Switsch oder eine andere Art VC++ davon zu überzeugen das
i nichtmehr sichtbar ist ?
-
#define for if(false);else for
-
Grundsatzfrage: Wieso willst du das überhaupt? i ist eine reine Zählervariable die benutzt man sonst für gar nix. Und selbst wenn man daran rumspielt wird i doch in jedem for am Anfang wieder auf 0 gesetzt. Das er das ANSI-konform ablehnen sollte ist mir auch nicht klar. Du definierst i doch vor dem {}-for Block.
-
und was hat das mit MFC zu tun ????
-
das liegt daran das in C++ die Variablen Blockweise angelegt werden können und auch nur in diesem angelgegten Block gültig sind:
[cpp]
int main()
{
int var1;{
int var2;
var2 = 2; //geht auch, da im selben block
}var2 = 0; // geht nicht mehr, die variable ist hier nicht mehr bekannt
var1 = 10; //das geht weils im selben Block ist
}
[/cpp]
das gleiche bei deinem beispiel[cpp]
main()
{
...
for(int i=0; i<4;++)
{
}i=2 //das geht, das i in diesem "aktuellen Block" angelegt wurde
...
}
[/cpp]
und... {for(int i=0; i<4;++) { }} //i ist nur in den fetten klammern bekannt i=2 //fehler
-
Chris++ schrieb:
[cpp]
main()
{
...
for(int i=0; i<4;++)
{
}i=2 //das geht, das i in diesem "aktuellen Block" angelegt wurde
...
}
[/cpp]das ist aber eben nicht ISO C++
mit obigem define müsstest du vc++ 6 aber heilen können. bei vs .net gibts dafür nen extra switch /Zc:forScoope
-
Hmm Tatsache wirklich nicht ISO-konform.
Heißt wenn ich das mache:int main() { for(int i=0; i<4;i++) { } // Irgendwas for(int i=0; i<4;i++) { } }
Motzt VC das ich i zweimal definiere. Mach ich das:
int main() { for(int i=0; i<4;i++) { } // Irgendwas for(i=0; i<4;i++) { } }
Motzt VC nicht mehr, es sei denn man verwendet einen anderen Compiler. Gibt es noch mehr solche Sachen die einem bei einem anderen Compiler um die Ohren fliegen? Abgesehen von void main.
-
Es gibt unzählige solcher Inkonformitäten bei VC6, deswegen sollte man nach Möglichkeit auch Version 7.1 benutzen.
Das Problem mit dem for-Scope kannst du umgehen, indem du das for einsperrst (wie camper bereits gezeigt hat).
-
Tja, erstmal sorry das ich den Post im falschen Forum gemacht habe, habs leider zu spät gemerkt und keine Möglichkeit gefunden den selber zu verschieben (vlt. ne neue Aufgabe für den Admin wenn er Langeweile hat).
Danke camper, das
#define for if(false);else for
ist ne nette Lösung die genau das macht was ich will, ich werd mal bei
Gelegenheit prüfen ob das Performance kostet oder ob der Compiler das
wegoptimiert. Aber das ist mit Sicherheit absolut vernachlässigbar wenns
überhaupt Performance kostet.
Danke auch für /Zc:forScoope für .net, habe eigentlich angenommen das es
bei .net nicht auftritt, kannte nur den switsch für den g++, den es schon 1996 gab (-fno-for-scope).asdrubael, die Grundsatzfrage wollte ich eigentlich nicht aufwerfen, aber der
Hauptgrund warum ich das möchte ist das es öfters mal vorkommt das ich aus
Faulheit eine ganze for-schleife kopiere, etwas abändere aber an einer stelle noch die alte zählvariable drin habe und es zu fehlern führt die wieder Zeit
zum Aufspüren/Beseitigen brauchen. Und außerdem geht es mir einfach ums Prinzip.Danke nochmal an alle