Der Name "C++"
-
Artchi schrieb:
lucky_tux schrieb:
Das bedeutet dass man jedes C Programm auf einem C++-Compiler übersätzen kann.
Und das geht ebend NICHT!
Dann haste nen beshcissenen compiler.
Lass mich raten: Du nutzt ein Microsoft compiler oder ein Borland compiler?
Borland ist eh nur der Schwanz von Microsoft.
-
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 ofdo_it' with no type main.cc: In functionint main()':
main.cc:3: error: too many arguments to functionint 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 ofdo_it' with no type main.cc:11: error:int do_it' redeclared as different kind of symbol
main.cc:3: error: previous declaration ofint 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 ofdo_it' with no type main.cc: In functionint main()':
main.cc:3: error: too many arguments to functionint 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 ofdo_it' with no type main.cc:11: error:int do_it' redeclared as different kind of symbol
main.cc:3: error: previous declaration ofint 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 variablex' 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