for-Schleifenvariable innerhalb der Schleife neu definieren

09/09/2009 - 23:58 von Sebastian Schuberth | Report spam
Hallo,

ich bin vor kurzem über folgendes Scope-Problem gestolpert, was mir
beim Vergleich von GCC 4.4.0 und VS 2008 aufgefallen ist. Folgender
Code müsste IMHO (spàtestens seit C99) ungültig sein:

int main()
{
for (int i=0;i<10;++i)
{
int i ; // i wird neu definiert.
}
return 0;
}

Da AFAIK ab C99 der Scope einer for-Schleifenvariable sich auf die for-
Schleife beschrànkt (also "i" nach der schließenden Klammer der for-
Schleife nicht mehr verfügbar ist), ist es quasi so, als würde das
erste "i" innerhalb der for-Schleife definiert werden, genau wie das
zweite "i", und da sie somit im selben Scope definiert wurden, sollte
der Code nicht kompilieren. In VS 2008 tut er das auch nicht ("error:
redefinition; multiple initialization"), in GCC 4.4.0 aber schon, und
zwar einwandfrei, selbst mit "-stdÉ9 -Wall -pedantic".

Ich habe außerdem auf die schnelle weder in VS 2008 einen Compiler-
Switch gefunden, um den Code zu akzeptieren, noch in GCC 4.4.0, es
nicht zu tun.

Was ist, nach neuestem Standard, hier das richtige Verhalten? Wie kann
ich die beiden Compiler dazu bringen, sich gleich (und
standardkonform) zu verhalten?

Komischerweise habe ich dazu keine Infos gefunden. Alle for-Scope
Beitràge, die ich bisher gefunden habe, beziehen sich auf die (Un)
gültigkeit der for-Schleifenvariable *nach* der Schleife.

Danke schonmal.

Sebastian Schuberth
 

Lesen sie die antworten

#1 Claus Reibenstein
10/09/2009 - 08:57 | Warnen spam
Sebastian Schuberth schrieb:

ich bin vor kurzem über folgendes Scope-Problem gestolpert, was mir
beim Vergleich von GCC 4.4.0 und VS 2008 aufgefallen ist. Folgender
Code müsste IMHO (spàtestens seit C99) ungültig sein:

int main()
{
for (int i=0;i<10;++i)
{
int i ; // i wird neu definiert.
}
return 0;
}



Ich wüsste nicht, was daran ungültig sein soll.

Da AFAIK ab C99 der Scope einer for-Schleifenvariable sich auf die for-
Schleife beschrànkt



Nur, wenn sie innerhalb des for-Statements deklariert wird.

ist es quasi so, als würde das
erste "i" innerhalb der for-Schleife definiert werden, genau wie das
zweite "i"



Das zweite "i" wird innerhalb eines Blocks deklariert, ist also ein
anderes "i" als das erste "i", welches außerhalb dieses Blocks
deklariert wurde.

In VS 2008 tut er das auch nicht ("error:
redefinition; multiple initialization")



Wenn VS (was immer das ist) dieser Meinung ist, dann ist VS kaputt.

Was ist, nach neuestem Standard, hier das richtige Verhalten? Wie kann
ich die beiden Compiler dazu bringen, sich gleich (und
standardkonform) zu verhalten?



Ich würde sagen: GCC verhàlt sich standardkonform, VS nicht. Wie man
Letzteren dazu bewegt, sich ebenso zu verhalten, erfragst Du besser in
einer Gruppe, die sich mit diesem Compiler oder mit Compilern allgemein
befasst.

Komischerweise habe ich dazu keine Infos gefunden.



Versuch's doch mal mit dem Standard (ISO/IEC 9899:1999) :-)

,-
| 6.8.5.3 The for statement
|
| 1 The statement
|
| for ( clause-1 ; expression-2 ; expression-3 ) statement
|
| behaves as follows: [...] If clause-1 is a declaration, the scope of
| any variables it declares is the remainder of the declaration and
| the entire loop, including the other two expressions; it is reached
| in the order of execution before the first evaluation of the
| controlling expression. [...]
`-

Gruß. Claus

Ähnliche fragen