In C++ müssen Deklarationen in Funktionen nicht mehr am Anfang eines Blocks vor den ausführbaren Anweisungen stehen, sondern nur vor ihrer ersten Verwendung. Das kann sehr übersichtlich sein, wenn beispielsweise Schleifenzähler oder andere nur sehr lokal verwendete Variablen direkt bei ihrer Verwendung definiert werden:
// Time-stamp: "(15.11.01 16:10) lokal.cpp [Klaus Wachtler (aw38)]" #include <iostream> using namespace std; int main() { cout << "sosiedassaus!" << endl; for( int i=0; i<10; i++ ) { cout << "i ist " << i << endl; } return 0; }
Leider herrscht bei bei Microsoft eine beachtliche Ignoranz gegenüber allen Normen vor, auch was den Gültigkeitsbereich einer so definierten Variable betrifft: Der VC++ (zumindest bis Version 6.0) läßt i auch über die Schleife hinaus leben, während [Strou IV] klar sagt:
6.3.3.1 Deklarationen in for-Anweisungen
Eine Variable kann im Initialisierungsteil einer for-Anweisung deklariert werden. Wenn dieser Initialisierer eine Deklaration ist, bleibt die eingeführte Variable (oder die Variablen) bis zum Ende der for-Anweisung gültig. Beispiel:
void f( int v[], int max ) { for (int i=0; i<max; i++) v[i] = i*i; }
Falls der Endwert eines Index nach dem Verlassen der for-Schleife noch benötigt wird, muß die Indexvariable außerhalb der for-Schleife deklariert werden...
Damit ist zwar beim GCC und allen anderen modernen Compilern, nicht aber mit dem VC++ folgendes standardkonform möglich:
//... for( int i=0; i<10; i++ ) { // ... } //... for( int i=0; i<5; i++ ) { // ... }
Für den VC++ müßte das Beispiel so aussehen:
//... for( int i=0; i<10; i++ ) { // ... } //... for( i=0; i<5; i++ ) { // ... }
Um Quelltext jetzt portabel zu halten, bis [Strou IV] auch in Redmond in den Bücherläden steht, hat man zwei Möglichkeiten:
//... int i = 0; for( i=0; i<10; i++ ) { // ... } //... for( i=0; i<5; i++ ) { // ... }Das hat den Nachteil, daß die Variable i jetzt auch über die letzte Schleife hinaus bis zum Ende des umgebenden Blocks gilt. Das widerspricht dem Streben, Deklarationen möglichst lokal zu halten.
//... { for( int i=0; i<10; i++ ) { // ... } } //... { for( int i=0; i<5; i++ ) { // ... } }Das ist unschön und umständlich.
AnyWare@Wachtler.de