c oder doch c++
-
Syntax_error schrieb:
C++ ist, wie der name schon sagt, eine Erweiterung der Sprache C!
War es vielleicht mal vor so 20 Jahren... Die Paradigmen sind so stark auseinander gegangen das zumindest die, die sauberen C++ Code schreiben, nur wenig Überscheidungen mit C finden werden (viel zu wenige um C zu empfehlen, wenn jemand C++ lernen will, zumal er sich dann die C-Paradigmen aneignet, und das Ablegen selbiger fällt manchen schwer).
Nach deiner Erklärung müsste auch C#, C++/CLI usw. C-Ableger sein. Das ist aber nicht so.
Prinzipiell kann man in C++ (nahezu komplett) ein C Programm schreiben, umgekehrt geht dies nicht (oder nur bedingt durch ziemlich aufwändige Nachbauten).
@w81: MFC ist zum Lernen von C++ so ziemlich das schlechteste (ungeachtet davon ob du vielleicht später mit der MFC arbeitest). Die API orientiert sich an einen C++ Stil der schon lange als überholt gilt, und ist eigentlich nur ein [vom Stil veralteter] C++ Wrapper um eine C-API.
Lern die Sprache, die du wirklich lernen willst, und mach darin keine Umwege (und vor allem: Falls es sich um C++ handelt - lass die Oberflächenprogrammierung erst einmal weg, du stellst dir beim Lernen nur selbst ein Bein).
-
@Ethon,
Kompiliere das folgende C89 Programm in C++:#include <stdlib.h> int main(void) { int* arr = malloc(sizeof(int) * 10); free(arr); return 0; }Damit ist bereits schon bewiesen, dass C++ nicht einfach nur eine Erweiterung von C89 ist, sonst müssten alle C89 Programme auch in C++ laufen.
Gibt übrigens noch weitere Unterschiede, wie zum Beispiel die unterschiedliche Bedeutung der folgenden Deklaration:
int foo();In C89 ist das eine Funktion, welche beliebig viele Parameter annehmen kann. Der folgende Code ist somit gültiges C89:
foo(10, "hello", 34.2132f);In C++ wird dies aber nicht kompilieren, da hier die Deklaration bedeutet, dass die Funktion keine Parameter annimmt.
Bereits hier sieht man, dass keine vollständige Kompatibilität vorhanden ist. Von einer reinen Erweiterung kann man daher nicht sprechen. Wenn man dann noch die Konzepte und Ideen hinter den Sprachen ansieht, dann muss man endgültig von zwei unterschiedlichen Sprachen sprechen, welche sich einfach nur in der Syntax sehr ähnlich sind. Bzw. die eine Sprache ist eindeutig aus der anderen entstanden.
Grüssli
-
Dravere schrieb:
In C89 ist das eine Funktion, welche beliebig viele Parameter annehmen kann.
Aber können diese Parameter auch benutzt werden? Und würde es dann (wenn sie nicht verwendet werden können) syntaktisch Sinn machen, Code mit sowas vollzumüllen?
-
Hacker schrieb:
Aber können diese Parameter auch benutzt werden?
Ja.
#include <stdio.h> void foo(); int main(void) { foo(10, 3.234, "hello"); return 0; } void foo(int x, double d, char* str) { printf("%d, %f, %s", x, d, str); }Hacker schrieb:
Und würde es dann (wenn sie nicht verwendet werden können) syntaktisch Sinn machen, Code mit sowas vollzumüllen?
Wir sprechen hier von Unterschieden, nicht ob irgendwelche Sprachfeatures Sinn machen oder nicht. Sowas ist am Ende nämlich meistens von subjektiver Natur.
Grüssli
-
Dravere schrieb:
Hacker schrieb:
Und würde es dann (wenn sie nicht verwendet werden können) syntaktisch Sinn machen, Code mit sowas vollzumüllen?
Wir sprechen hier von Unterschieden, nicht ob irgendwelche Sprachfeatures Sinn machen oder nicht. Sowas ist am Ende nämlich meistens von subjektiver Natur.
Nein, so meinte ich das nicht. Ich glaube, jeder wird mit mir übereinstimmen, dass folgendes "Feature" Schwachsinn wäre:
int foo(); int main() { foo("adf", 5, 7.45);//Man kann nichts mit den Übergabeparametern tun, sie aber trotzdem "übergeben" } int foo(){return 0;}In deinem Beispiel wird die Funktion im bezug auf ihre Parameter redefiniert, was nicht war wie ich es mir Vorstellte.

-
Hacker schrieb:
Nein, so meinte ich das nicht. Ich glaube, jeder wird mit mir übereinstimmen, dass folgendes "Feature" Schwachsinn wäre:
Nein, da wird dir nicht jeder zustimmen. Du denkst da ein wenig zu kurz.
Hacker schrieb:
In deinem Beispiel wird die Funktion im bezug auf ihre Parameter redefiniert, was nicht war wie ich es mir Vorstellte.
Deine Vorstellung ist da anderswo falsch. Ich mache keine Redefinition. Ich mache eine Definition und eine Deklaration. Deklaration und Definition sind in C, wie auch in C++, unterschiedliche Dinge.
Wieso du hier zu kurz denkst ist die folgende Situation:
Du kannst hier eine Deklaration haben, aber unterschiedliche Definitionen zum Beispiel für unterschiedliche Plattformen (also durch Makros unterschieden) wobei der Aufruf sich nicht verändert. Zumindest habe ich es so schon in der Verwendung gesehen. Ich finde das zwar auch nicht sehr prickelnd, aber das ist am Ende eben subjektiv.#include <stdio.h> void foo(); int main(void) { foo(10, 3.234, "hello"); return 0; } #ifdef BLUB_UNIX void foo(int x, double d) { printf("%d, %f", x, d); } #else void foo(int x, double d, char* str) { printf("%d, %f, %s", x, d, str); } #endifGrüssli
-
Dravere schrieb:
Ich mache keine Redefinition. Ich mache eine Definition und eine Deklaration.
Klar. War auch schlecht umschrieben, nur sind die Übergabeparameter der Deklaration und der Definition unterschiedlich, also...
Dravere schrieb:
Deklaration und Definition sind in C, wie auch in C++, unterschiedliche Dinge.
Das ist Selbstverständlich.
Dravere schrieb:
Du kannst hier eine Deklaration haben, aber unterschiedliche Definitionen zum Beispiel für unterschiedliche Plattformen (also durch Makros unterschieden) wobei der Aufruf sich nicht verändert. Zumindest habe ich es so schon in der Verwendung gesehen. Ich finde das zwar auch nicht sehr prickelnd, aber das ist am Ende eben subjektiv.
#include <stdio.h> void foo(); int main(void) { foo(10, 3.234, "hello"); return 0; } #ifdef BLUB_UNIX void foo(int x, double d) { printf("%d, %f", x, d); } #else void foo(int x, double d, char* str) { printf("%d, %f, %s", x, d, str); } #endifNun, ich verstehe nicht wieso man es nicht so macht:
#include <stdio.h> #ifdef BLUB_LINUX void foo(int, double); #else void foo(int, double, char*); #endif int main(void) { foo(10, 3.234, "hello"); return 0; } #ifdef BLUB_UNIX void foo(int x, double d) { printf("%d, %f", x, d); } #else void foo(int x, double d, char* str) { printf("%d, %f, %s", x, d, str); } #endif
-
Hacker schrieb:
Dravere schrieb:
Ich mache keine Redefinition. Ich mache eine Definition und eine Deklaration.
Klar. War auch schlecht umschrieben, nur sind die Übergabeparameter der Deklaration und der Definition unterschiedlich, also...
Also was? Das spielt keine Rolle.
Hacker schrieb:
Nun, ich verstehe nicht wieso man es nicht so macht:
Probier dein Code für
BLUB_UNIXzu kompilieren, nachdem du natürlich den Fehler korrigiert hast. Du hast nämlich einmalBLUB_LINUXund einmalBLUB_UNIX
Jedenfalls es kommt dann der folgende Fehler oder so ähnlich:
error: too many arguments to function 'foo'Grüssli
-
Edit: Einen weiter unten.
-
Dravere schrieb:
Jedenfalls es kommt dann der folgende Fehler oder so ähnlich:
error: too many arguments to function 'foo'Grüssli
Äh Nein? Es kommt kein Fehler, keine Warnung.
-
Hacker schrieb:
Du bist doof.
Verstehst du eigentlich wie peinlich das ist?
-
cooky451 schrieb:
Hacker schrieb:
Du bist doof.
Verstehst du eigentlich wie peinlich das ist?
Gut, gut. Schon weg. Nur, wieso postet er dann was nicht stimmt?
-
@Hacker,
Du willst mich auf den Arm nehmen? Wie wäre es, wenn du das Makro BLUB_UNIX definierst, wie ich es dir gesagt habe.Ich habe nur ein
#define BLUB_UNIXam Anfang eingefügt.
http://ideone.com/8yFtrAlso nochmals, wie war das mit dem "doof"?

Grüssli
-
Hacker schrieb:
Gut, gut. Schon weg. Nur, wieso postet er dann was nicht stimmt?
Ich meinte nicht das "du bist doof". Ich meinte die ganze Diskussion. Was soll das? Das Sprachmittel ist offensichtlich nicht das sinnvollste, sonst hätte C++ es nicht rausgeworfen. Aber gerade dass C++ es rausgeworfen hat ist doch Tatsache, und ich verstehe nicht, wie man diese Tatsache verschwinden lassen will. Dass du das Sprachmittel blöd findest ändert doch überhaupt nichts.
-
@Dravere: In der "doku", oder was auch immer sonst, muss erklärt werden, dass die Funktionen auf unterschiedlichen Betriebssystemen unterschiedlich deklariert (und definiert natürlich) werden.
Das mit dem doof stimmt schon irgendwie
:p , denn wieso sollte man überhaupt die Funktion auf verschiedenen Betriebssystemen unterschiedlich deklarieren und dann nur eine Anwendung kennen? Es muss doch (offensichtlich) einen Grund geben, wieso sie unterschiedlich ~ werden.
-
Also so langsam ...
Ich habe hier die Deklaration abgeändert, wie ich es weiter vorne schon gesagt hatte. Und es funktioniert hier mit
#define BLUB_UNIXund auch ohne:
http://ideone.com/jQNTb
http://ideone.com/2YfHZDie Deklaration ist auf allen Betriebsystemen die gleiche und nicht unterschiedlich! Der Aufruf ist überall gleich! Die Implementation ist anders, weil gewisse Parameter auf gewissen Betriebsysteme halt nicht benötigt werden. Aber wie gesagt, über Sinn und Unsinn von so einem Feature müssen wir hier gar nicht debattieren, weil es darum gar nicht geht!
*grosser Seufzer*

Grüssli