gcc ANSI-C Dateiendung .cpp



  • Sebastian_Hoelzl schrieb:

    In der Uni benutzen wir Visual Studio und dessen C-Compiler. Dafür müssen die Programmdateien als .cpp gespeichert werden.

    VS verkraftet auch .c

    Sebastian_Hoelzl schrieb:

    Ich darf zur Lösung der Aufgabe nur ANSI-C benutzen.

    Streng genommen ist ANSI-C die Normung von 1989. Die kennt z.B. nicht den Zeilenkommentar mit //
    Danch ist es ISO-C.



  • Sowohl gcc wie auch der VStudio Compiler cl.exe "erkennen" C-Quellcodes an der Endung *.c und C++ Quellcodes an *.cpp, falls keine anderen expliziten Schalter für die Spracherkennung gesetzt sind.
    Leider setzt die VStudio IDE bei neuen Projekten defaultmäßig (ohne Nachfrage wie z.B. bei CodeBlocks) C++ als Standard, es sei denn man fügt explizit *.c Dateien zum Projekt hinzu.

    Für korrektes ANSI C muss man dann noch "Spracherweiterungen deaktivieren" in den Projekteinstellungen.

    Für gcc äquivalent:

    gcc -ansi *.c
    


  • ein Blick auf die Fehlermeldung sagt doch alles. malloc liefert void* zurück, da malloc ja nicht weiß, was man da für speicher reserviert hat.

    also
    if ((anfang = (struct bezirk*)malloc(sizeof(struct bezirk))) == NULL) {
    und
    if((zeiger->next = (strukt bezirk*) malloc(sizeof(struct bezirk))) == NULL){

    und schon sollte es funktionieren. dass der compiler von visual studio das durchgehen lässt............ 👎



  • HansKlaus schrieb:

    malloc liefert void* zurück

    Und void* ist in C ohne cast in jeden anderen Zeiger konvertierbar.



  • aha, ich habs trotzdem so gelernt. 😕
    aber ein expliziter typcast ist doch nicht unkonform, oder irre ich da?

    wäre aber auf jeden fall einfacher gewesen, dem compiler einfach seinen wunsch zu erfüllen.



  • Einfacher ja, aber nicht zielführend. Wenn man C kompilieren will, sollte man auch einen C-Compiler nehmen. Und nicht so lange mit dem Holzhammer auf den Code einprügeln, bis der C++-Compiler ihn frisst.



  • Der eigentliche Fehler ist hier die Dateiendung cpp statt c 💡



  • wenn man den compiler mit .cpp füttert, tut er ja auch so, als würde er c++ vor sich haben.
    irgendwie ist jetzt der zeitpunkt für ne grundsatzdiskussion darüber, ob c nicht eigentlich auch c++ bzw. c++ nur c mit erweiterungen ist, gekommen. 😃

    rename code.cpp code.c wäre aber langweilig gewesen



  • HansKlaus schrieb:

    wenn man den compiler mit .cpp füttert, tut er ja auch so, als würde er c++ vor sich haben.
    irgendwie ist jetzt der zeitpunkt für ne grundsatzdiskussion darüber, ob c nicht eigentlich auch c++ bzw. c++ nur c mit erweiterungen ist, gekommen. 😃

    rename code.cpp code.c wäre aber langweilig gewesen

    Nein.


  • Mod

    HansKlaus schrieb:

    irgendwie ist jetzt der zeitpunkt für ne grundsatzdiskussion darüber, ob c nicht eigentlich auch c++ bzw. c++ nur c mit erweiterungen ist, gekommen. 😃

    Da muss man nicht diskutieren, die Antwort ist, dass C keine Untermenge von C++ ist. Basta! Eines der wichtigsten Gegenbeispiele wurde hier im Thread genannt. Der C++-Standard hat eine lange Liste mit weiteren Inkompatibilitäten.


Anmelden zum Antworten