Variablenbereich in C ++
-
28-09-2019 - |
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.)
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 derfor-statement
erstreckt.
Andere Tipps
Nein, wäre es nicht (§3.3.2 Local scope):
- 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.
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 ++.