Warum will der C-Compiler von Microsoft die Variablen zu Beginn der Funktion?

7

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.

    
yinyueyouge 01.04.2009, 13:34
quelle

10 Antworten

33

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).

    
dwc 01.04.2009, 13:37
quelle
7

Der Microsoft C-Compiler ist C89-kompatibel und wird nicht mehr aktualisiert, der Standard C99 ist nicht geplant. Verwenden Sie für einfache C in C99 (Variablen nicht am Anfang des Blocks) einen anderen Compiler oder C ++ Erweiterung.

    
nothrow 01.04.2009 13:40
quelle
3

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.

    
Will Dean 01.04.2009 14:12
quelle
2

Ich weiß nicht für C99, aber für frühere Versionen der Sprache müssen lokale Variablen am Anfang eines {} Blocks deklariert werden.

    
mouviciel 01.04.2009 13:39
quelle
1

In C90 müssen alle Variablen vor der ersten Anweisung deklariert werden. Dies ist in C99 nicht der Fall. Ich nehme an, Sie können sehen, ob der Compiler einen Schalter für C99 hat.

    
Pesto 01.04.2009 13:39
quelle
1

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.

    
CookieOfFortune 01.04.2009 13:40
quelle
1

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.

    
Lennaert 01.04.2009 13:42
quelle
1

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.

    
cletus 01.04.2009 13:37
quelle
1

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.

    
Michael Burr 01.04.2009 17:04
quelle
0

Die C-Spezifikation erfordert, dass alle Variablen vor der ersten Zeile des ausführbaren Codes deklariert werden. Der Compiler hält sich an die Spezifikation. Einige Compiler sind in dieser Hinsicht nachsichtig.

    
JadeMason 01.04.2009 13:39
quelle

Tags und Links