Ich schreibe gerade ein C (nicht C ++). Es scheint, dass der C-Compiler von Microsoft verlangt, dass alle Variablen oberhalb der Funktion deklariert werden.
Zum Beispiel wird der folgende Code die Kompilierung nicht bestehen:
%Vor%Der Compiler meldet einen Fehler in der dritten Zeile und sagt
%Vor%Wenn der Code wie folgt geändert wird, wird die Kompilierung durchgeführt:
%Vor% Wenn ich den Quelldateinamen von .c
zu .cpp
ändere, wird auch die Kompilierung durchgeführt.
Ich vermute, es gibt irgendwo eine Option, um die Strenge des Compilers auszuschalten, aber ich habe es nicht gefunden. Kann mir jemand weiterhelfen?
Vielen Dank im Voraus.
Ich verwende cl.exe, das mit Visual Studio 2008 SP1 geliefert wird.
Hinzugefügt:
Danke euch allen für die Antwort! Es scheint, dass ich in C89 mit Microsofts cl.exe leben muss.
Es sieht so aus, als ob es den C89-Standard verwendet, der erfordert, dass alle Variablen vor jedem Code deklariert werden. Sie können sie mit Literalen usw. initialisieren, aber nicht Code und Variablen mischen.
Es sollte ein Compiler-Flag geben, um C99 irgendwo zu aktivieren, was Ihnen das Verhalten bringt, das Sie gewohnt sind.
BEARBEITEN: Das schnelle Googlen sieht beim Aktivieren von C99 nicht vielversprechend aus. Sie müssen vielleicht mit C89 leben (was nicht so schlimm ist) oder einen besseren C-Compiler finden (was besser wäre).
Wie andere bereits gesagt haben, ist dies nur die Version von C, die von MSC unterstützt wird. Wenn Sie jedoch bereit sind, die Puristen zu beleidigen, können Sie den Compiler zwingen, als C ++ zu kompilieren.
Dies wird sehr wenig Unterschied zu reinem C machen (es gibt einige Regeln über das Gießen von void * -Zeigern und Namensdekorationsänderungen), aber könnte Ihnen einen nützlichen Hybrid geben. Der erzeugte Code wird sehr ähnlich sein - es gibt keinen magischen Verlust (oder Gewinn) an Effizienz durch diese Änderung.
Sie sagen nicht, warum Sie gerne C benutzen.
Es erleichtert die Übersetzung in die Baugruppe. Alle Variablen werden beim Eingeben der Funktion auf den Stapel geschoben, sodass Sie sich keine Gedanken darüber machen müssen, woanders zu arbeiten.
Stimmen Sie dem Kommentar zur C-Spezifikation zu. Denken Sie daran, dass C in einer Zeit erstellt wurde, in der Computer nicht viel Speicher hatten.
Eine Möglichkeit, damit umzugehen, war sicherzustellen, dass eine Quelldatei in einem einzigen Durchlauf von oben nach unten gelesen werden kann (was auch der Grund ist, warum .h-Dateien verwendet werden - sie geben dem Code das gewisse Etwas) Funktionen existieren tatsächlich, aber möglicherweise irgendwo nach dem ersten Mal, dass sie referenziert werden).
Es ist wahrscheinlich einfacher, einen Compiler für Code zu erstellen, der Variablen an der Spitze eines Bereichs deklariert, als für Code, der Variablen überall deklarieren kann.
Der C89-Standard, den Sie basierend auf diesem Fehler verwenden müssen, erfordert, dass die Variablen deklariert werden, bevor Sie Anweisungen in einem Block ausführen.
Sie werden dieses Problem mit CPP-Erweiterungsdateien nicht haben, weil der Compiler diese als C ++ - Dateien behandelt, die nicht die gleiche Einschränkung haben.
Ihre assert-Anweisung ist Code, so dass Sie danach keine Variable mehr deklarieren können (im selben Block / Bereich).
Technisch könnte man das machen:
%Vor%aber ich würde es nicht empfehlen.
Es ist eine Schande, dass MS gemischte Deklarationen und Anweisungen nicht als Erweiterung des C-Compilers implementiert (auch wenn es standardmäßig deaktiviert ist und aktiviert werden muss). Ich bin mir nicht sicher, aber ich denke, es ist eine ziemlich häufige Erweiterung in anderen Nicht-C99 C-Compilern; Es scheint oft genug zu sein, dass ich Quellcode und Samples reparieren muss, um sie in MSVC zu kompilieren.
Ich denke, es wäre relativ einfach zu implementieren, da sie das natürlich schon für C ++ tun.