Merkwuerdiger Compiler Fehler bei C-Strings



  • Hi
    Ich habe gerade etwas mit C-Strings herumgespielt und bin dabei auf folgendes gestossen:

    Kompiliert:

    int main()
    {
    	char ch[] = "Hello";
    	//ch[2] = 'L';
    	char *chp = "World";
    }
    

    Kompiliert:

    int main()
    {
    	char ch[] = "Hello";
    	ch[2] = 'L';
    	//char *chp = "World";
    }
    

    Kompiliert nicht:

    int main()
    {
    	char ch[] = "Hello";
    	ch[2] = 'L';
    	char *chp = "World";
    }
    

    Fehlermeldung: error C2143: syntax error : missing ';' before 'type'

    Kann mir das jemand erklaeren? Ich nehme an, dass es ein peinlicher Fehler ist von mir aber ich sehe es einfach nicht 🙄



  • Nach C89 kommen erst die Variablendefinitionen und dann der Code.

    Welchen Compiler hast du denn?
    Ach 'C2143', dann hast du ein MS-VS.
    Der kann kein C99.



  • Dann muss ich in jeder Funktion zuerst alle Variabeln deklarieren und erst nachher anderen Code ausfuehren? 😕



  • icarus2 schrieb:

    Dann muss ich in jeder Funktion zuerst alle Variabeln deklarieren und erst nachher anderen Code ausfuehren? 😕

    Ja.



  • icarus2 schrieb:

    Dann muss ich in jeder Funktion zuerst alle Variabeln deklarieren und erst nachher anderen Code ausfuehren? 😕

    Na ja, sooo schlimm ist das nun auch wieder nicht.
    Das wurde fast 30 Jahre gemacht, bis es in C99 die frei platzierbare Deklaration gab.



  • Es ist nicht besonders schlimm aber etwas unschoen.

    Danke fuer die Antworten.



  • MS halt.



  • prinzipiell heißt es ja auch Visual C++...
    Der Compiler unterstützt halt nebenbei C, aber die Priorität hat hier offensichtlich C++ 😉



  • Darüber gab's auch schon die ein oder andere Diskussion...
    Ich finde es persönlich recht praktisch, wenn ich in einem Scope genau 1 Stelle habe, um die entsprechende Variable zu suchen, falls Änderungen anstehen.
    Das ist mir auch wichtiger, als die Variable "just in time" direkt vor Ort zu deklarieren, um auch als Hirnspender noch zu wissen, wofür die Variable gedacht gewesen sein könnte...



  • In C und C++ gibt es auch unterschiedliche Argumente für die Platzierung von Variablen.

    Beispielsweise sollte man Variablen in C++ erst dort definieren, wo sie verwendet werden,
    da bei Klassen immer ein Konstruktoraufruf mit dranhängt.

    Ein Beispiel:

    void foo()
    {
        fstream file("foo.bar");
        if (!file)
            return;
        string firstline;
        getline(file, firstline, '\n');
    }
    

    Ist jetzt nur ein Beispiel, aber würde man hier wie in C89 üblich firstline bereits am Anfang der Funktion definieren, so würde auf jedenfall ein string konstruiert werden.
    Bei dynamischer Positionierung der Definition eben nur, wenn der if-Zweig nicht erfüllt wird.

    In C gibt es wiederum keine versteckten Funktionsaufrufe (Konstruktoren, Destruktoren, casting-Operatoren, ...).
    Alle Variablen, die ich in einer Funktion definiere können direkt auf dem Stack angelegt werden, ohne dass automatisch Platz auf dem Heap reserviert wird.
    Man macht es dem C-Compiler daher in gewisser Weise leichter, wenn man festlegt,
    dass Variablen bereits am Anfang des Scopes definiert werden müssen.

    Vom generierten Assemblercode her dürfte die Position der Variablendefinition keinen in C keinen Einfluss haben... in C++ sehr wohl.

    Dass man in C99 auch eine freie Positionierung gestattet, ist wohl nur, um den Programmierern ein wenig das Denken abzunehmen :p



  • 314159265358979 schrieb:

    MS halt.

    Nö, C90 und früher.



  • Aber MS hält es nach über 10 Jahren immer noch nicht nötig den aktuellen Standard zu unterstützen.
    Aber wie schon gesagt, ist es ein C++ Compiler der auch C kann



  • DirkB schrieb:

    Aber MS hält es nach über 10 Jahren immer noch nicht nötig den aktuellen Standard zu unterstützen.
    Aber wie schon gesagt, ist es ein C++ Compiler der auch C kann

    Na beim aktuellen C++-Standard haben die ja auch so ihre Probleme, mitzukommen. 😉



  • DirkB schrieb:

    Aber MS hält es nach über 10 Jahren immer noch nicht nötig den aktuellen Standard zu unterstützen.

    Ja, warum sollten sie auch? 😉 C99 hat sich nie wirklich durchgesetzt und für die Programmierung auf Windows ist C im Gesamten auch nicht das Maß der Dinge.
    Die Nachfrage ist wohl nicht in bedeutendem Umfang da, siehe auch das VC++ Team Blog:
    http://blogs.msdn.com/b/vcblog/archive/2007/11/05/iso-c-standard-update.aspx
    Oder letzter Post hier: http://connect.microsoft.com/VisualStudio/feedback/details/345360/visual-c-should-support-c99



  • PrettyP schrieb:

    Ich finde es persönlich recht praktisch, wenn ich in einem Scope genau 1 Stelle habe, um die entsprechende Variable zu suchen, falls Änderungen anstehen. Das ist mir auch wichtiger, als die Variable "just in time" direkt vor Ort zu deklarieren, um auch als Hirnspender noch zu wissen, wofür die Variable gedacht gewesen sein könnte...

    Ich halte es aus alter Gewohnheit genauso: Erst alle Variablen an genau einer Stelle deklarieren, evtl. initialisieren, und erst dann im Code einsetzen. Ob man da während der Laufzeit mehr Resourcen beansprucht, juckt mich wenig. Hauptsache man selbst (oder ein anderer) findet sich jederzeit schnell zurecht, falls Fehler gesucht werden müssen oder eine Änderung ansteht!

    Bei Koch- und Backrezepten wird üblicherweise auch erst die Zutatenliste angegeben und erst danach erklärt, wie man das zusammenrühren soll. 🙄



  • berniebutt schrieb:

    Bei Koch- und Backrezepten wird üblicherweise auch erst die Zutatenliste angegeben und erst danach erklärt, wie man das zusammenrühren soll. 🙄

    Ja, weil du die Resourcen nicht zuhause hast. Wenn du im Supermarkt kochen würdest, wäre dir das egal.



  • 314159265358979 schrieb:

    Ja, weil du die Resourcen nicht zuhause hast. Wenn du im Supermarkt kochen würdest, wäre dir das egal.

    Gute Idee! 👍 Gehen wir gemeinsam in den Supermarkt für ein feines 4-Gänge Menü - Vorschlag: Tapas - Hummersuppe - Schweinebraten im Schlafrock, dazu Kartoffelknödel mit Gemüse - Dessert - Wein, Grappa. Haben die alles und auch die notwendigen Küchengeräte sowie Teller, Besteck, Gläser usw., sogar Tisch, Stühle, Musikanlage gibt es dort. Und wenn unser Outfit nicht passt, kleiden wir uns einfach dort neu ein!

    Zurück zum Thema: dürfte ausreichend diskutiert sein.



  • Wie alle Vergleiche, hinkt dieser etwas.



  • Macht ihn aber nicht weniger unterhaltsam!
    Abgesehen davon würde ich mich geehrt fühlen, mit Bernie im Supermarkt zu kochen, bin aber unsicher, ob ich je in das Land reisen werde, das er bewohnt 🙂


Anmelden zum Antworten