Der Name "C++"



  • Hallo,

    So wie ebend auch nicht geht :p

    @normal: man sollte sich aber den thread ganz durchlesen. Es wurde ausdrücklich von otze gesagt, dass man nicht jedes C-Programm auf C++-Compilern "übersätzen" kann.

    MFG winexec*



  • nach der entwicklung von C++ kam ein neuer C sprachstandard mit neuen features raus, die in C++ nicht mehr übernommen wurden. Welcher C++ Compiler der standardkonform ist, sollte diese features also unterstützen.



  • @ winexec:

    Nur weil jemand behauptet das es nicht möglich wäre C Quelltext auf einem C++-Compiler zu kompilieren, bedeutet das noch längst nicht das die Aussage korrekt ist.

    Würded ihr mir auch glauben, dass C++ ein neumodischer Brotbackautomat, der sich bei einem bekannten schwedischen Möbelhaus erkaufen lässt, ist?

    Habt ihr "The C++ Programming Language" oder die dt. Übersetzung "Die C++ Programmiersprache" von Bjarne Stroustrup gelesen. Hier wird ausdrücklich gesagt das C++ abwärtskonform du C ist - C++ ist eine Erweiterung oder eine Obermenge von C. Somit lässst sich jeder C-Quelltext unter einem C++-Compiler ubersätzen. Bedingung dafür ist aber, dass der Quelltext und der Compiler sich an die Standards halten. Da sich der M*cr*soft Compiler aber nicht an die Standards hällt ist es nicht verwunderbar das die Abwärtskommpatibilität nicht vorhanden ist.

    Anderes Beispiel: Was hat M*cr*soft aus Java gemacht? Java ist eine plattformunabhängige Programmiersprache. Aber die Version von Microsoft wurde so modifiziert, dass es nicht möglich ist Java-Programme von Windows zu portieren.



  • Nein, ich habe einen ISO-C++ konformen Compiler, und das ist wichtig. Warum soll ein ISO-C++ Compiler einen ISO-C-Standard unterstützen, wenn er ein ISO-C++ Compiler ist??? Wenn ich C kompilieren will, nehme ich einen C-Compiler. Wenn ich Java compilieren will, nehme ich einen Java-Compiler. Wenn ich C#...

    Merkt ihr hier was?



  • lucky_tux: Du hast einfach keine Ahnung.



  • lucky_tux schrieb:

    Habt ihr "The C++ Programming Language" oder die dt. Übersetzung "Die C++ Programmiersprache" von Bjarne Stroustrup gelesen. Hier wird ausdrücklich gesagt das C++ abwärtskonform du C ist - C++ ist eine Erweiterung oder eine Obermenge von C. Somit lässst sich jeder C-Quelltext unter einem C++-Compiler ubersätzen. Bedingung dafür ist aber, dass der Quelltext und der Compiler sich an die Standards halten. Da sich der M*cr*soft Compiler aber nicht an die Standards hällt ist es nicht verwunderbar das die Abwärtskommpatibilität nicht vorhanden ist.

    Von wann ist dieses Buch? Aha!

    Der C- und C++-Standard werden von zwei verschiedenen ISO-Komitees verabschiedet. Es gibt heute in C Features, die wir in C++ seit 7 Jahren vergeblich suchen. Man sollte sich über den aktuellen Stand der Technik informieren. Man sagt nicht umsonst, das die Computerwelt schnelllebig ist. Dazu zählt nicht nur die CPU-Technik, sondern auch die von Software und Sprach-Normierungen.

    Und das sich der MS-Compiler nicht an den ISO-Standard hält, stimmt auch nicht. Informier dich mal, das Herb Sutter (MS-Mitarbeiter!) den Vorsitz im ISO-C++ Komitee inne hat! Und das Herb Sutter einiges tut um C++ und sein Baby C++/CLI zu pushen. Selbst TR1 wird demnächst vom MSVC unterstützt werden. Und wenn C++/CLI mit in den ISO-C++-Standard einfliessen wird (was das Ziel von MS ist!), wird der Compiler weiter die ISO-C++-Norm unterstützen müssen. Also selbst die nächsten Jahre wird MS den ISO-C++ unterstützen, da sie ISO-C++ pushen.



  • @lucky_tux:

    Dann erklär mir mal wieso den folgenden Code kein C++-Compiler, den ich hier habe, übersetzt, aber jeder C-Compiler?

    #include <stdio.h>
    
    static do_it( );
    
    int main(void)
    {
        int x = do_it(12);
    }
    
    static do_it(x)
        int x;
    {
        return x * 2;
    }
    


  • @lucky_tux
    Es ist zwar richtig, dass C++ seine Wurzeln in C hat. Damit irrst du allerdings:

    Somit lässst sich jeder C-Quelltext unter einem C++-Compiler ubersätzen.

    Zwischen C und C++ besteht keine echte Teilmengenbeziehung. Weder ist C eine echte Teilmenge von C++, noch andersherum.
    Zwar übernimmt der C++ Standard einige Teile des C-Standards (C89), er führt aber auch Änderungen hinzu, die legale C-Programme in C++ illegal machen. Beispiel dafür ist das strengere Typsystem von C++.
    Am Beispiel:

    #include <stdlib.h>
    int main() {
       int* i = malloc(sizeof(int));
    }
    

    Das ist ein völlig legales C-Programm, aber kein C++.
    In C++ müsste es so aussehen:

    #include <stdlib.h>
    int main() {
       int* i = static_cast<int*>(malloc(sizeof(int)));
    }
    

    Der Grund: C89 definiert eine implizite Typkonvertierung von void* zu jedem anderen Datenzeiger. In C++ hingegen ist diese Konvertierung nicht implizit. Hier ist nur die umgekehrte Richtung implizit. Wer also von void* nach int* will muss in C++ immer casten.

    Das ist nur ein Beispiel. Es gibt tausende andere. Umgangssprachlich kann man C++ als Obermenge von C bezeichnen, korrekt ist es aber nicht. Im Gegensatz zu Java und C++ oder C# und C++ teilen C und C++ aber nicht nur syntaktische Gemeinsamkeiten.



  • @ LordJaxiom:

    Der Quelltext funktioniert nicht mit dem C++ Compiler. Ist es das was du hören willst? Gut okey.... aber der Quelltext funktioniert auch nicht mit einem C-Compiler!

    martin@debian:~/Documents/temp/utest$ gcc main.cc
    main.cc:3: error: ISO C++ forbids declaration of do_it' with no type main.cc: In functionint main()':
    main.cc:3: error: too many arguments to function int do_it()' main.cc:7: error: at this point in file main.cc: At global scope: main.cc:10: error:x' was not declared in this scope
    main.cc:11: error: ISO C++ forbids declaration of do_it' with no type main.cc:11: error:int do_it' redeclared as different kind of symbol
    main.cc:3: error: previous declaration of int do_it()' main.cc:11: error: Syntaxfehler beforeint'
    martin@debian:~/Documents/temp/utest$



  • C++ ist als Erweiterung aber auch konzeptionelle Erneuerung von C zu sehen.

    C++ wurde in den 80er Jahren in den Bell Laboratories entwickelt. Die erste Version eines C++-Compilers entstand 1985 bei AT&T. Bjarne Stroustrup http://www.henkessoft.de/C++/Cpp_school/stroustrup.jpg gilt als Erfinder der Sprache C++.

    Aus dem ursprünglichen „C mit Klassen“ wurde später der Begriff C++, der auf den Inkrementoperator ++ hindeutet. Im Jahr 1986 veröffentlichte Bjarne Stroustrup das wegweisende Buch „The C++ Programming Language“, das auch heute noch als wichtiges Lehrbuch und Standardwerk anerkannt wird.

    Der ANSI Standard für C++ wurde erst im Juni 1998 festgelegt.

    Neben dem Ziel, eine objektorientierte Sprache zu schaffen, war die Abwärtskompatibilität zu C ein wichtiges Ziel. Deshalb ist C als Teilmenge von C++ vorhanden, was manche Anwender aus heutiger Sicht kritisieren, weil sie sich ein reinrassiges objektorientiertes C++ wünschen.

    Bjarne Stroustrup, der Entwickler der ersten C++-Version drückte die Fähigleiten von C++ in folgender Weise aus:
    "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off."
    http://www.research.att.com/~bs/bs_faq.html



  • @lucky_tux:
    Achso und deshalb steht in der Meldung "ISO C++ forbids" *hirnbatsch*

    Ändere doch mal die Endung auf .c



  • Die Fehlermeldungen sehen nach C++ Kompilierung aus. 🙄 🙄

    ISO C++ forbids



  • lucky_tux schrieb:

    Der Quelltext funktioniert nicht mit dem C++ Compiler. Ist es das was du hören willst? Gut okey.... aber der Quelltext funktioniert auch nicht mit einem C-Compiler!

    martin@debian:~/Documents/temp/utest$ gcc main.cc
    main.cc:3: error: ISO C++ forbids declaration of do_it' with no type main.cc: In functionint main()':
    main.cc:3: error: too many arguments to function int do_it()' main.cc:7: error: at this point in file main.cc: At global scope: main.cc:10: error:x' was not declared in this scope
    main.cc:11: error: ISO C++ forbids declaration of do_it' with no type main.cc:11: error:int do_it' redeclared as different kind of symbol
    main.cc:3: error: previous declaration of int do_it()' main.cc:11: error: Syntaxfehler beforeint'
    martin@debian:~/Documents/temp/utest$

    Äh. Hallo? Du solltest das natürlich auch als C kompilieren. Nicht C++.



  • LordJaxom schrieb:

    @lucky_tux:

    Dann erklär mir mal wieso den folgenden Code kein C++-Compiler, den ich hier habe, übersetzt, aber jeder C-Compiler?

    #include <stdio.h>
    
    static do_it( );
    
    int main(void)
    {
        int x = do_it(12);
    }
    
    static do_it(x)
        int x;
    {
        return x * 2;
    }
    

    Hey, willst du hier etwa jemandem klarmachen, dass du die alte R&K C Syntax aus den 70ern noch nutzt? Ging es denn gerade nicht um die _aktuellen_ Standards?



  • Ging es denn gerade nicht um die _aktuellen_ Standards?

    Schau dir einfach mein Beispiel an. Gibt gar keinen Grund esoterische Sprachfeatures zu benutzen.



  • Das hat wenig mit Esoterik zu tun als damit dass man das Geld um alten Code der immernoch läuft zu aktualisieren nicht ausgibt, wenn es nicht nötig ist 😉

    Und bei uns im Haus hat diese Unwissenheit wie sie auch lucky_tux an den Tag legt genau dazu geführt, dass man mal einfach C-Code nach Windows portiert, als C++ kompiliert hat und sich jetzt wundert, warum der VS2005 (der sehr wohl sehr standardkonform ist) das nicht mehr schluckt.



  • Die Fehlermeldungen sehen nach C++ Kompilierung aus.

    Nein. Ich habe den C-Compiler gcc aufgerufen.

    Aber asche über mein haupt ich hatte eine falsche Extension



  • Aber die Ausgaben beim Kompilieren deuten auf Programmierstil den man sich nicht aneignen sollte.

    main.c:3: Warnung: type defaults to `int' in declaration of `do_it'
    main.c: In Funktion »main«:
    main.c:7: Warnung: unused variable x' main.c:8: Warnung: control reaches end of non-void function main.c: Auf höchster Ebene: main.c:11: Warnung: return type defaults toint'

    Dadurch wird meiner meinung nach nur unnötig verwirrung geschafft



  • lucky_tux schrieb:

    Nein. Ich habe den C-Compiler gcc aufgerufen.

    $ man gcc
    C++ source files conventionally use one of the suffixes .C, .cc, .cpp, .CPP, .c++, .cp, or .cxx; [...] GCC recognizes files with these names and compiles them as C++ programs even if you call the compiler the same way as for compiling C programs (usually with the name gcc).

    MfG



  • Aus Compiler-Fragen halte ich mich raus, das ändert sich ständig. Windows hat übrigens recht wenig mit C++ zu schaffen, es basiert im Wesentlichen auf C und WinAPI. Neuere C++-GUI-Frameworks versuchen es verstärkt sich im Sinne der OOP an C++ anzulehnen.

    Lassen wir doch noch mal den Erfinder der ersten C++-Generation zu Wort kommen:

    C++ is a general purpose programming language with a bias towards systems programming that

    * is a better C
    * supports data abstraction
    * supports object-oriented programming
    * supports generic programming.

    http://www.research.att.com/~bs/C++.html (May 10, 2006)

    Daher sollte man auch die Entwicklung von C erwähnenen, auf dessen Fundamente C++ immer noch stabil ruht. 🙂

    http://cm.bell-labs.com/cm/cs/who/dmr/
    http://cm.bell-labs.com/cm/cs/who/dmr/chist.html
    http://cm.bell-labs.com/cm/cs/who/dmr/bigbio1st.html

    Interessanter ist eigentlich die Frage nach der Weiterentwicklung von C++, um Schwächen zu entfernen und Stärken zu betonen.

    http://de.wikipedia.org/wiki/C++

    Stärken

    * Die Erzeugung hocheffizienten Codes ist möglich.
    * Sowohl maschinennahe als auch hochabstrakte Programmierung ist möglich.
    * Sehr hohe Ausdrucksstärke und Flexibilität – Beispiel: die anpassbare Freispeicherverwaltung, in die sich etwa nahtlos eine automatische Speicherbereinigung (englisch garbage collector) integrieren lässt.
    * Für große Projekte geeignet.
    * Weite Verbreitung.
    * Die Sprache ist nicht im Besitz einer Organisation (im Unterschied zu beispielsweise Java). Standardisierung durch die ISO
    * Weitreichende Möglichkeiten für die Metaprogrammierung
    * Kompatibilität mit C – Vorteil: Es steht eine breite Codebasis zur Verfügung.
    * Jede C++-Entwicklungsumgebung für Windows verfügt heute bereits über eine Bibliothek vorgefertigter C++-Klassen (Framework), mit dem sich der Programmieraufwand erheblich reduzieren lässt.

    Schwächen

    * Kompatibilität mit C – Nachteil: historischer Ballast muss mitgeschleppt werden, zum Beispiel der von C übernommene Präprozessor, oder die teilweise schwer verständliche C-Syntax. Die Kompatibilität zu C hat u. a. zur Folge, dass einige Details der Sprache Compiler-spezifisch sind, die es aber nicht sein müssten. So ist beispielsweise die Auswertungsreihenfolge von Teilausdrücken je nach Compiler und Plattform unterschiedlich. Dies erschwert die Portierung von C++-Programmen zwischen Rechnertypen, Betriebssystemen und unterschiedlichen Compilern.
    * Die aktuellen Compiler (Stand: 2005) sind rückständig bezüglich der Umsetzung der ISO-Norm.
    * Die aktuellen Compiler produzieren nicht immer optimalen Code, sowohl in Bezug auf Geschwindigkeit als auch auf Code-Größe.
    * Zum Erlernen sind verhältnismäßig lange Einarbeitungszeiten erforderlich.
    * Die aktuelle C++-Standardbibliothek deckt einige neue Erfordernisse noch nicht ausreichend ab, zum Beispiel Threads, TCP/IP, Dateisystem-Verzeichnisse. Deshalb besteht in diesen Bereichen, bei Verwendung herstellerspezifischer Bibliotheken, eine eingeschränkte Portabilität über Betriebssystemgrenzen hinweg (Entwicklung zahlreicher externer Bibliotheken).
    * Aufgrund des breiten Leistungspektrums und der vielfältigen Gestaltungsmöglichkeiten ist die Verwendung von Programmierrichtlinien (aus Gründen der Wartbarkeit und Fehleridentifizierung) mehr als in anderen Sprachen anzuraten.

    Verwandtschaft mit C

    C++ ist eine Erweiterung der Programmiersprache C gemäß dem Stand von 1990 (ISO/IEC 9899:1990, auch kurz C90 genannt). C++ enthält C nach dem Stand C90 fast vollständig. Einige wenige C-Programme lassen sich nicht ohne weiteres als C++ kompilieren beziehungsweise haben als C++-Programme eine etwas andere Bedeutung. Dabei handelt es sich aber um Sonderfälle, die in der Praxis keine große Rolle spielen.

    Die Kompatibilität mit C war eines der Hauptdesignziele bei der Entwicklung der Programmiersprache C++. Grund dafür war die große Verbreitung von C. C-Compiler sind auch heute noch für praktisch jeden Prozessor verfügbar. Deswegen gilt die Kompatibilität mit C immer noch als eine der wichtigsten Eigenschaften von C++.

    Im Laufe der Entwicklung der beiden Sprachen gab es auch Rückwirkungen von C++ auf C. Beispielsweise wurden in C const sowie die Funktionsprototypen von C++ übernommen.

    Die letzten Änderungen an C fanden 1999 statt (ISO/IEC 9899:1999). Gemäß dem Ratifizierungsjahr 1999 spricht man, wenn man sich auf diesen C-Stand bezieht, deshalb auch von C99. Ein Beispiel für darin eingeführte Spracherweiterungen sind die so genannten VLAs (engl. variable length array).

    Aufgrund dieser Weiterentwicklung von C gibt es theoretisch mehr Inkompatibilitäten zwischen C und C++. Mittlerweile unterstützen viele Compiler diesen neuen Stand C99 in der Sprachdefinition und nicht ganz so viele auch in der Bibliothek, so dass die Bedeutung dieser Unterschiede zwischen C und C++ zunimmt. Bei der in Arbeit befindlichen C++-Version wird u. a. daran gearbeitet, die neuen C99-Merkmale mit einzuarbeiten. Einige C++-Compiler unterstützen C99-Neuerungen schon jetzt (z. B. der gcc).

    Man kann historisch gesehen nicht einfach von C oder C++ reden, man sollte den genauen Stand, auf den man sich bezieht, nennen. Mal gibt es Inkompatibilitäten mal nicht, je nachdem wer wen befruchtet und welchen Compiler und welche Version man einsetzt.

    Auf jeden Fall beruht C++ auf C. Dies war klares Designziel. Das sollte man im Nachhinein nicht "verbiegen".

    Wie man hier im Forum sieht, gibt es auch nur einen Rahmen sowohl für C als auch für C++.


Anmelden zum Antworten