Frage

Wenn ich den folgenden Code habe:

for(int myvar = 0; myvar < 10; myvar++);
if(1)
{
    int var2 = 16;
}

Dann später schrieb ich folgendes:

myvar = 0;
var2 = 0;

Wäre das legal? Mein VC ++ 6 compiliert es richtig, aber ich denke, das sollte illegal sein. (Es gibt einen Compiler-Fehler in einem meiner anderen Compilern.)

War es hilfreich?

Lösung

VC6 ist ziemlich alt und nicht immer ... starr ... in der Anwendung der Norm :-) Es eigentlich durchgesickert Umfang unter bestimmten Umständen wie:

for (int i = 0; i < 10; i++) { }
// You can still use 'i' here.

Dies führt zu einem gewissen flippigen Makro Magie , um dieses Problem zu umgehen. Wenn Sie einen ISO-konformen Compiler verwenden, diese beiden Dinge, die Sie versuchen zu tun illegal.

Von ISO C ++ 11 3.3.3/1, die sich mit der Einführung von Block Umfang mit {...}:

  

Ein Name in einem Block deklariert ist lokal für diesen Block; es hat Block Umfang. Sein Potential Umfang beginnt an seinem Punkt der Erklärung und endet am Ende seines Blockes.

Abschnitt 6.5.3 deckt den Umfang der Variablen „erzeugt“ durch eine for Anweisung:

  

Wenn die for-init-statement eine Erklärung ist, der Umfang des Name (n) erklärten Ende der for-statement erstreckt.

Andere Tipps

Nein, wäre es nicht (§3.3.2 Local scope):

  
      
  1. Ein Name in einem Block deklariert (6.3) ist lokal für diesen Block. Sein Potential   Umfang beginnt an seinem Punkt   Deklaration (3.3.1) und endet bei der   Ende seiner deklarativen Region.
  2.   

Ich empfehle Sie Compiler in den letzten zehn Jahren veröffentlicht verwenden.

Das sollte illegal sein, aber VC6 war sehr schlecht dazu.

In Visual Studio 2005 eine neue Projektebene Einstellung benannt wurde eingeführt "Kraft Konformität in For-Schleife Scope" . Dies adressiert das Problem und zur Verfügung gestellt Abwärtskompatibilität als auch. Was bedeutet, dass ältere Codebasen in neueren Versionen von Visual Studio durch Deaktivieren dieser Einstellung kompilieren kann.

Allerdings ist eine Sache, die MS rechts in VS2005 tat dies auf damit standardmäßig zu drehen, ein wenig näher kommen zu den Standards.

  

Wäre das legal? Mein VC ++ 6 compiliert es richtig, aber ich denke, das sollte illegal sein.

Nein sollte es nicht legal sein. Dump VC ++ 6. Verwenden Sie einen neuen und besseren Compiler.

nahm VC etwa einem Jahrzehnt für Variablen in Schleifen und bedingte Anweisungen erklärt richtigen Umfang umzusetzen. Im Allgemeinen können Sie nicht auf VC6 verlassen Urteil in Bezug auf C ++.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top