Warum sollte man C und C++ eigentlich nicht mischen... ?
-
It0101 schrieb:
Was ich eigentlich sagen wollte:
Wenn man C verwendet, sollte man auch dazu stehen.
Und BOOST ist eben auch teilweise C ...Das "ist" hier ist sehr ungenau. Boost verwendet intern C-Stil, ja. Bleibt ja auch nichts anderes übrig, wenn die OS-APIs in C geschrieben sind. Nach außen ist mir aber nicht bekannt, dass Boost irgendwo eine Schnittstelle im C-Stil hätte.
Daher find ich das lächerlich wenn hier Leute behaupten sie würden nicht mischen, aber eben doch durch Boost indirekt C-Code verwenden...
Indirekt ist hier das Schlagwort. Wie schon gesagt, mit "mischen" ist gemeint, dass man im gleichen Code C-Stil und C++-Stil verwendet. Es geht hier nicht um die gelegentliche Benutzung von Funktionen aus der C-Standardbibliothek, für die es in C++ keine Entsprechungen gibt. Es geht hier auch nicht darum, dass in gut abgegrenzten Bereichen aus Performance- oder anderen Gründen C-Code benutzt wird und diese Funktionen dann im C++-Code benutzt werden (so wie bei Boost). Es geht darum, in C++-Code auch die C++-Mittel zu benutzen, die es für die jeweilige Aufgabe gibt, und nicht im selben Code wild zu mischen.
C-Code hat seine Berechtigung in C++-Programmen, aber sauber getrennt und mit Vernunft eingesetzt. Das ist keine Mischung und nicht lächerlich. Lächerlich ist, ohne nachzudenken jeden kleine Fitzel C-Code von Anfang an zu verteufeln, und lächerlich ist genauso zu sagen, "dort ganz hinten in der Ecke steht ein Stück C-Code, also ist das eh ne Mischung und ich darf überall wild mischen".
-
pumuckl schrieb:
Indirekt ist hier das Schlagwort. Wie schon gesagt, mit "mischen" ist gemeint, dass man im gleichen Code C-Stil und C++-Stil verwendet.
Da kann ich im wesentlich mitgehen. Bleibt nur zu hoffen, dass alle die gleiche Definition verwenden wie du.
Wenn ich mich recht entsinne gibt es hier auch ein paar Kandidaten, die behaupten, komplett auf C zu verzichten, auch indirekt. Das mag bei Hello-World-Anwendungen funktionieren, aber sobald man im Multithreadingbereich, im Socketbereich und sonstwo unterwegs ist, wirds ganz schnell ganz schön dünn.Kurzum: komplett ohne C geht es in der professionellen Softwareentwicklung nicht.
Was mir grad einfällt:
gibts eigentlich eine Variable Parameterliste in C++ à la "va_list" in C ?
-
Variadic Templates mit C++11

-
314159265358979 schrieb:
Variadic Templates mit C++11

Hmm sieht interessant aus

-
It0101 schrieb:
Wenn ich mich recht entsinne gibt es hier auch ein paar Kandidaten, die behaupten, komplett auf C zu verzichten, auch indirekt. Das mag bei Hello-World-Anwendungen funktionieren, aber sobald man im
Die reden Unfug.
cout << "hello, world!" << endl;Das Stringliteral ist C. Und im Wahn, C zu meiden wurde endl statt '\n' verwendet, dabei ist das recht dumm, denn es macht noch heimlich ein flush, das kein Mensch braucht.
-
lk schrieb:
Ich bin eigentlich einer, der es kaum erwarten kann bis er Assembly lernt. Je mehr hardcore desto besser. (Hab mit C++ angefangen, dann richtung C#/Java(war nichts), dann eben C(leider werde ich mit Java an der Uni gequält), jetzt will ich eben assembly lernen.)
Das ist ja durchaus legitim, dass Du gerne "hardcore" programmierst, aber es lässt erahnen dass Deine Arbeiten sich bisher auf kleine Fummeleien in deinem Kämmerlein beschränken. Natürlich können es auch große Fummeleien sein, aber Zielgruppe von modernen C++ Methoden und Weisheiten oder generell die Lehre von OOP sind eher Leute, die in großen Projekten mit mehreren Leuten (und evtl. für viel Geld) arbeiten, oder sich eben in diese Richtung entwickeln wollen.
Natürlich kannst Du Dir als großer Assembler Fummler einen Namen machen, aber dann wird es immer einen geben, der dir sagen muss was genau du zu tun hast und der überlegt wie dein Gefummel in das Gesamtsystem integriert wird ohne dass es dem Rest des Teams auf die Nerven geht.lk schrieb:
Wenn "dir wird arbeit und denken abgenommen!" kommt, fliege ich schon vom Hocker, oder bin eben bereits am Boden.
Tja.. nach der Uni wird Deine Arbeit aber verdammt viel Geld kosten und Geld für unnötige Arbeit will keiner bezahlen. Genauso will niemand unnötig für Arbeit bezahlen, die durch Denkfehler (die jeder macht) entstehen. Fehler macht man in jeder Programmiersprache und mit jeder Programmiertechnik, aber in der einen mehr und in der anderen weniger und vor allem billigere Fehler. Ein Compilezeitfehler ist natürlich lange nicht so schlimm wie ein Laufzeitfehler (zb. iostreams vs. printf).
Für alles was du an Fehlern durch geschicktes Programmieren nicht ausschließen kannst musst du Tests schreiben und ausführen. Es sei denn Du programmierst für dich selbst, dann kannst du Tests weglassen und sowieso arbeiten wie du willst. Dann hat sich die Frage auch erübrigt, dann machst Du das was Dir passt.It0101 schrieb:
Oh man... Dann ziehen sich alle den Boost::Heiligenschein über und im Hintergrund werkelt immernoch pthread_create oder _beginthread...
Du findest das vielleicht witzig, aber genau das ist eines der wichtigsten Prinzipien der OOP und nennt man Kapselung. Ein unschönes aber einfach notwendiges OS Gefummel wird hinter einer schönen Schnittstelle verpackt, die eine einfache und vor allem fehlerfreie Verwendung bietet. Oftmals ist man einfach gezwungen C Techniken anzuwenden, weil man auf irgendeine C API angewiesen ist. C++ bietet mir aber die Möglichkeit diese unschönen Implementierungsdetails zu verstecken, entweder durch selber Schreiben oder durch die Verwendung einer der vielen vorhandener Bibliotheken.
-
Ist die idee vom Programmieren denn eigentlich nicht, alles selbst zu machen? Die völlige Kontrolle zu behalten? Das ist ja was ich nicht leiden kann, wenn mir mit dem "du musst nicht mehr so viel denken" abgenommen wird. (-> Java/C#). Wenn da eine einzige funktion fehlt ist man am Ende, dann kommt als fertiges projekt sowas raus wie Windows; aus häppchen irgendwie zusammengekleistert. Bei Linux muss man auch vieles selbst machen, und die ganzen websites die 100% Garantie brauchen, laufen auf linux. Windows denkt natürlich, es ist einfacher wenn es arbeit abnimmt, ist es auch. aber dann kommt eben dieser mist raus.
(Betriebsysteme nur zur veranschaulichung, bitte jetzt nicht über das Fehlen von Mac OS X beschwehren)
-
lk schrieb:
Ist die idee vom Programmieren denn eigentlich nicht, alles selbst zu machen?
Meinst du das wirklich ernst? Was für einen Sinn hat es, selbst noch einmal alles neu zu programmieren, was professionelle Entwickler schon viel besser, schneller, sicherer programmiert haben, als man es selbst je schaffen wird?
lk schrieb:
Die völlige Kontrolle zu behalten? Das ist ja was ich nicht leiden kann, wenn mir mit dem "du musst nicht mehr so viel denken" abgenommen wird. (-> Java/C#).
Abstraktion ist was Gutes. Es hat keinen Sinn, jedes Mal neu über die grundlegendsten Boilerplate-Dinge wie Speicheranforderung nachzudenken. Das ist nur fehleranfällig, mühsam und macht den Code hässlich. Du solltest auch von deiner Sichtweise wegkommen, Low-Level-Programmierung sei so viel anspruchsvoller als abstrakte Herangehensweisen.
lk schrieb:
Windows denkt natürlich, es ist einfacher wenn es arbeit abnimmt, ist es auch. aber dann kommt eben dieser mist raus.
Nach "C vs. C++" und "Java-Programmierer müssen nicht denken" braucht dieser Thread sicher nicht auch noch einen "Windows ist doof"-Flamewar

-
Nexus schrieb:
lk schrieb:
Ist die idee vom Programmieren denn eigentlich nicht, alles selbst zu machen?
Meinst du das wirklich ernst? Was für einen Sinn hat es, selbst noch einmal alles neu zu programmieren, was professionelle Entwickler schon viel besser, schneller, sicherer programmiert haben, als man es selbst je schaffen wird?
Das wird vor allem schlicht und ergreifend sehr sehr teuer...

-
volkard schrieb:
Das Stringliteral ist C. Und im Wahn, C zu meiden wurde endl statt '\n' verwendet, dabei ist das recht dumm, denn es macht noch heimlich ein flush, das kein Mensch braucht.
Diese "\n"-Marotte hab ich letztens bei einer Nachhilfeschülerin gesehen...
Sie behauptete, der Kurs an der Uni würde C++ heißen und dann behauptete sie auch noch, der Prof würde die Studenten zwingen "\n" statt std::endl zu nutzen...Dann musste ich ihr leider erklären dass Professoren selten wirklich Ahnung von C oder C++ haben...

-
It0101 schrieb:
volkard schrieb:
Das Stringliteral ist C. Und im Wahn, C zu meiden wurde endl statt '\n' verwendet, dabei ist das recht dumm, denn es macht noch heimlich ein flush, das kein Mensch braucht.
Diese "\n"-Marotte hab ich letztens bei einer Nachhilfeschülerin gesehen...
Sie behauptete, der Kurs an der Uni würde C++ heißen und dann behauptete sie auch noch, der Prof würde die Studenten zwingen "\n" statt std::endl zu nutzen...Dann musste ich ihr leider erklären dass Professoren selten wirklich Ahnung von C oder C++ haben...

Der Prof hat aber recht!
-
Shade Of Mine schrieb:
It0101 schrieb:
volkard schrieb:
Das Stringliteral ist C. Und im Wahn, C zu meiden wurde endl statt '\n' verwendet, dabei ist das recht dumm, denn es macht noch heimlich ein flush, das kein Mensch braucht.
Diese "\n"-Marotte hab ich letztens bei einer Nachhilfeschülerin gesehen...
Sie behauptete, der Kurs an der Uni würde C++ heißen und dann behauptete sie auch noch, der Prof würde die Studenten zwingen "\n" statt std::endl zu nutzen...Dann musste ich ihr leider erklären dass Professoren selten wirklich Ahnung von C oder C++ haben...

Der Prof hat aber recht!
Nur wenn er erklärt, warum. Und wenn er genauer klarmacht wo endl keinen Sinn macht (und wo es Sinn macht).
-
It0101 schrieb:
Diese "\n"-Marotte hab ich letztens bei einer Nachhilfeschülerin gesehen...
Sie behauptete, der Kurs an der Uni würde C++ heißen und dann behauptete sie auch noch, der Prof würde die Studenten zwingen "\n" statt std::endl zu nutzen...Dann musste ich ihr leider erklären dass Professoren selten wirklich Ahnung von C oder C++ haben...

Kein Wunder, daß Du lauter schlechte Seiten an C++ findest.
#include <iostream> int main() { using namespace std; for(int i=0;i<10000000;++i) cout<<"hello, world\n"; }volkard@localhost ~/src/testcpp $ g++ -O3 -march=native main.cpp && time (./a.out > /dev/zero) real 0m1.329s user 0m0.877s sys 0m0.007sund
#include <iostream> int main() { using namespace std; for(int i=0;i<10000000;++i) cout<<"hello, world"<<endl; }volkard@localhost ~/src/testcpp $ g++ -O3 -march=native main.cpp && time (./a.out > /dev/zero) real 0m9.176s user 0m2.886s sys 0m4.883sNoch Fragen?
-
It0101 schrieb:
pumuckl schrieb:
Indirekt ist hier das Schlagwort. Wie schon gesagt, mit "mischen" ist gemeint, dass man im gleichen Code C-Stil und C++-Stil verwendet.
Da kann ich im wesentlich mitgehen. Bleibt nur zu hoffen, dass alle die gleiche Definition verwenden wie du.
Diejenigen, die das alles begründen können und nicht einfach sinnlos nachplappern, was sie meinen gelesen zu haben, werden das ziemlich genauso sehen
Leider gibt es den einen oder anderen, die Ratschläge zu einzelnen spezifischen Codebeispielen gleich als absolutes Dogma interpretieren und das dann entweder bei jeder unpassenden Gelegenheit anbringen oder aber gegen die "unangebrachte allgemeine Beschränkung" auf die Barrikaden steigen ohne zu sehen, dass solche Ratschläge nicht immer überall anzuwenden sind sondern Ausnahmen haben.
-
lk schrieb:
Ist die idee vom Programmieren denn eigentlich nicht, alles selbst zu machen? Die völlige Kontrolle zu behalten? Das ist ja was ich nicht leiden kann, wenn mir mit dem "du musst nicht mehr so viel denken" abgenommen wird. (-> Java/C#). Wenn da eine einzige funktion fehlt ist man am Ende, dann kommt als fertiges projekt sowas raus wie Windows; aus häppchen irgendwie zusammengekleistert. Bei Linux muss man auch vieles selbst machen, und die ganzen websites die 100% Garantie brauchen, laufen auf linux. Windows denkt natürlich, es ist einfacher wenn es arbeit abnimmt, ist es auch. aber dann kommt eben dieser mist raus.
Wie gesagt, wenn du willst nutze halt erst mal C, niemand hindert dich daran. Aber sag uns bitte bescheid, sobald du völlig entnervt aus deiner kleinen ich-will-Linux-Hacker-sein Welt ausgebrochen bist, weil du zum 150sten mal nach dreistündigem Debuggen gemerkt hast, dass du irgendwo nicht genug Speicher angefordert/freigegeben hast.
Natürlich macht es am Anfang Spaß, alles selbst mal nachzuprogrammieren. Nur irgendwann hast du das meiste schon gemacht und merkst, dass das auch keine Hexerei ist. Und dann wird es unendlich nervig jeden Mist wieder und wieder schreiben zu müssen und du wirst dich auf C++ freuen.
-
pumuckl schrieb:
Nur wenn er erklärt, warum. Und wenn er genauer klarmacht wo endl keinen Sinn macht (und wo es Sinn macht).
Ich halte endl für generell sinnlos. Wenn ich flushen will, flushe ich rasch mit flush.
cout<<"hello, world\n"<<flush;
-
lk schrieb:
Ist die idee vom Programmieren denn eigentlich nicht, alles selbst zu machen? Die völlige Kontrolle zu behalten?
Wenn Du das wirklich konsequent durchziehen willst, müsstest Du mit einem eigenen Betriebssystem beginnen, oder wo genau willst Du die Grenze ziehen?
-
Belli schrieb:
lk schrieb:
Ist die idee vom Programmieren denn eigentlich nicht, alles selbst zu machen? Die völlige Kontrolle zu behalten?
Wenn Du das wirklich konsequent durchziehen willst, müsstest Du mit einem eigenen Betriebssystem beginnen, oder wo genau willst Du die Grenze ziehen?
Hey, ich habs zumindest ein paar monate her geschaft hello world flackernd in verschiedenen farben in QEUM auszugeben
!
-
lk schrieb:
Hey, ich habs zumindest ein paar monate her geschaft hello world flackernd in verschiedenen farben in QEUM auszugeben
!Aber dafür hast du vermutlich irgendwelche Konsolenfunktionen des Betriebssystems benutzt. Schäm dich. Die Arbeit und den Grips hättest du auch noch investieren müssen

-
volkard schrieb:
It0101 schrieb:
Diese "\n"-Marotte hab ich letztens bei einer Nachhilfeschülerin gesehen...
Sie behauptete, der Kurs an der Uni würde C++ heißen und dann behauptete sie auch noch, der Prof würde die Studenten zwingen "\n" statt std::endl zu nutzen...Dann musste ich ihr leider erklären dass Professoren selten wirklich Ahnung von C oder C++ haben...

Kein Wunder, daß Du lauter schlechte Seiten an C++ findest.
Volkard, ich liebe C++ und ich liebe es sogar Wrapper zu basteln

Nur bin ich kein dogmatischer Programmierer, der sich irgendwelche Regeln vorsetzt. Ich nutze zu jedem Zeitpunkt das, was mir in dem Moment am besten in den Kram passt ( manchmal Usability, manchmal Performance, manchmal Code-Style ).
Und wenn auch C-Code zu einem Zeitpunkt für mich die beste Lösung ist, dann lass ich mir das nicht von irgendwelchen verbohrten Fanatikern schlecht reden.Es ist mir Brille ob std::endl oder "\n" schneller ist und ich wage auch zu bezweifeln, dass der Professor sich diese Frage gestellt hat.
Wer ne performante Bildschirmausgabe benötigt braucht ohnehin einen Kurs in Schnell-Lesen. Oder anders: Textausgabe ist nur ganz selten der Grund für Performancelöcher