 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Thomas Barth Guest
|
Posted: Sun Dec 10, 2006 3:24 pm Post subject: Vermengung von C und C++ |
|
|
Hallo,
spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere wie
in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur erweitern.
Beispiel unter Unix:
header.h
#include <dirent.h>
#include <cstring>
#include <fstream>
using std::ofstream;
using std::ios;
#include <iostream>
using std::endl;
source.cpp
void Filer::getDirEntries(const char dir[], ofstream &os) {
int numberOfEntries, i;
struct dirent **namelist, **list;
if ((numberOfEntries = scandir(dir, &namelist, 0, alphasort)) > 0) {
for(i = 0, list = namelist; i < numberOfEntries; i++, *list++) {
os << (*list)->d_name << endl;
free (*list);
}
free(namelist);
}
}
Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?
Thomas B |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Sun Dec 10, 2006 8:00 pm Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Barth schrieb:
| Quote: | spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere wie
in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur erweitern.
Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?
|
Ja. Aber das muss ja nicht das einzig Kriterium sein...
Ich werfe mal nur so Dinge wie Wartbarkeit, Lesbarkeit,
Platformunabhängikeit in den Raum.
Statt malloc und free gibts new und delete die normalerweise ein
bisschen mehr und besser machen.
Auch für alle anderen C-typischen Konstrukte wie Pointer und C-Strings
gibts bessere Alternativen in der STL. Für die C-Cast gibts es
spezialisiertere casts (static_cast, reinterpret_cast, dynamic_cast,
const_cast) die zwar unständlicher aussehen, dafür aber genau das machen
(und das auch prüfen) was man machen will. Es ist mir unverständlich
warum man in JAVA diese C-Casts weiterbenutzt. Inklusive ihrer komischen
Syntax. Denn Klammern um das drumrum was man casten will, ist meines
Erachtens sinnvoller.
Und printf benutzt doch keiner freiwillig seit cout.
In freier Wildbahn begegnet mir oft solcher Code. C, welches in eine
Klasse gepackt wurde und nun als C++ gehandelt wird...
Häßlich, tut nicht not.
Und dazu zählen peinlicherweise auch meine eigenen alten C++-Klassen,
wovon ich kürzlich ein paar ausgegraben habe. Allerdings waren da einige
Dinge notwenig. Wie die Verwendung der C-File-Funktionen (fopen und co),
statt fstream. Weil fstream beim damaligen Compiler (VC++ <6.0) buggy war.
Ich finde es viel schlimmer aus diversen Gründen C-Konstrukte verwenden
zu müssen. (Z.B. die win-api ohne MFC) Oder andere Dinge aus diversen
Bibliotheken.
Man sollte nie vergessen, dass C ursprünglich nie dafür gedacht war,
Anwendungsprogramme zu schreiben. Sondern "nur" dafür beim Entwickeln
von Unix den Assembler zu ersetzen... |
|
| Back to top |
|
 |
Thomas Barth Guest
|
Posted: Mon Dec 11, 2006 3:08 am Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Thiele wrote:
| Quote: | Thomas Barth schrieb:
spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere wie
in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur erweitern.
Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?
Ja. Aber das muss ja nicht das einzig Kriterium sein...
Ich werfe mal nur so Dinge wie Wartbarkeit, Lesbarkeit,
Platformunabhängikeit in den Raum.
|
Was ist aber, wenn's anders gar nicht geht und man auf die Funktionen,
die der Sprache C zur Verfügung stehen, angewiesen ist? Bei meinem
Beispiel geht es um die unixspezifische Funktion scandir aus dirent.h.
Da muss sogar free() verwendet werden. Ich habe in sämtlichen
C++-Büchern danach gesucht, wie das Einlesen von Dateien aus
Verzeichnissen funktioniert. In dem Buch "The C++ Standard Library - A
Tutorial and Reference Guide" taucht der Begriff Directory auf den 642
Seiten gar nicht erst auf und in "The C++ Programming Language 3rd Ed"
Bjarne Stroustrup genau fünf mal im Zusammenhang mit include directory.
Ich dachte mir, bevor ich jetzt lange suche, verpacke ich die Funktionen
schön in C++-Klassen und kann die Methoden ja später immer noch anders
implementieren, wenn ich herausgefunden habe, wie es C++ typisch gemacht
wird.
Thomas B |
|
| Back to top |
|
 |
Thomas Thiele Guest
|
Posted: Mon Dec 11, 2006 10:11 am Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Barth schrieb:
| Quote: | Was ist aber, wenn's anders gar nicht geht und man auf die Funktionen,
die der Sprache C zur Verfügung stehen, angewiesen ist?
|
Den Fall habe ich doch schon beschrieben:
"Ich finde es viel schlimmer aus diversen Gründen C-Konstrukte verwenden
zu müssen."
| Quote: | Beispiel geht es um die unixspezifische Funktion
|
Geht halt nicht anders. In einer reinen c++-Umgebung würde ichmir
Wrapper-Klassen bauen. Aber das hast du ja auch vor.
Wo ist das Problem?  |
|
| Back to top |
|
 |
Andreas Huennebeck Guest
|
Posted: Mon Dec 11, 2006 2:41 pm Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Barth wrote:
| Quote: | Thomas Thiele wrote:
Thomas Barth schrieb:
spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere wie
in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur
erweitern.
Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?
Ja. Aber das muss ja nicht das einzig Kriterium sein...
Ich werfe mal nur so Dinge wie Wartbarkeit, Lesbarkeit,
Platformunabhängikeit in den Raum.
Was ist aber, wenn's anders gar nicht geht und man auf die Funktionen,
die der Sprache C zur Verfügung stehen, angewiesen ist? Bei meinem
Beispiel geht es um die unixspezifische Funktion scandir aus dirent.h.
Da muss sogar free() verwendet werden. Ich habe in sämtlichen
C++-Büchern danach gesucht, wie das Einlesen von Dateien aus
Verzeichnissen funktioniert. In dem Buch "The C++ Standard Library - A
Tutorial and Reference Guide" taucht der Begriff Directory auf den 642
Seiten gar nicht erst auf und in "The C++ Programming Language 3rd Ed"
Bjarne Stroustrup genau fünf mal im Zusammenhang mit include directory.
Ich dachte mir, bevor ich jetzt lange suche, verpacke ich die Funktionen
schön in C++-Klassen und kann die Methoden ja später immer noch anders
implementieren, wenn ich herausgefunden habe, wie es C++ typisch gemacht
wird.
|
Das ist völlig richtig, aber Du bist garantiert nicht der erste, der scandir in einen
C++ Wrapper packt (auch ich bekenne mich schuldig . Es gibt aber mittlerweile
genügend plattformübergreifende Bibliotheken, die das bereits für Dich (und mich)
erledigt haben: qt, vermutlich boost, ..., einfach mal google anwerfen.
Tschau
Andreas
--
Andreas Hünnebeck | email: acmh (AT) gmx (DOT) de
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
PGP-Key: http://www.huennebeck-online.de/public_keys/pgp_andreas.asc |
|
| Back to top |
|
 |
Axel Schwenke Guest
|
Posted: Mon Dec 11, 2006 3:13 pm Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Thiele <thomas.thiele (AT) gmx (DOT) de> wrote:
| Quote: | Thomas Barth schrieb:
spricht was dagegen, nur das Klassenkonzept und den damit verbundenen
Designmöglichkeiten (Designpatterns) zu übernehmen und alles andere
wie in C umzusetzen? C++ sollte doch C nicht ersetzen, sondern nur
erweitern.
|
Da spricht (fast) nichts dagegen. Ich sehe es sogar als großen Vorteil
von C++ gegenüber z.B. Java an, daß es mir erlaubt, den für das Problem
angemessenen Mix von OO- und prozeduralem Code zu schreiben.
| Quote: | Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?
|
Wenn du einen Auftraggeber oder ein Team hast, müssen die das natürlich
auch akzeptieren. Aber im Prinzip: ja.
| Quote: | Auch für alle anderen C-typischen Konstrukte wie Pointer und C-Strings
gibts bessere Alternativen in der STL.
|
Über das "besser" kann man hin und wieder streiten.
| Quote: | Und printf benutzt doch keiner freiwillig seit cout.
|
IBTD. Gerade kürzlich habe ich (nach langer Abstinenz) mit der Forma-
tierung bei Verwendung von C++ Streams gekämpft. Konkret ging es um
die Umsetzung des folgenden Codes mit C++ Mitteln:
char c;
FILE *f;
....
if (isprint(c))
fprintf(f, "%c", c);
else
fprintf(f, "\\x%02x", c);
(das ist ein Teil eines Code-Generators, der binäre Strings in C[++]
konforme Stringliterale umsetzen soll)
| Quote: | Man sollte nie vergessen, dass C ursprünglich nie dafür gedacht war,
Anwendungsprogramme zu schreiben. Sondern "nur" dafür beim Entwickeln
von Unix den Assembler zu ersetzen...
|
Woher hast du diese Weisheit? IMNSHO ist die Verwendung von C in keiner
Weise eingeschränkt. Man kann es fast genauso gut für Kernel-Code wie
für GUI-Applikationen verwenden. Gerade das macht es ja so mächtig.
XL |
|
| Back to top |
|
 |
Thomas J. Gritzan Guest
|
Posted: Mon Dec 11, 2006 9:06 pm Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Barth schrieb:
| Quote: | Was ist aber, wenn's anders gar nicht geht und man auf die Funktionen,
die der Sprache C zur Verfügung stehen, angewiesen ist?
|
Dann benutze die C-Funktionen. C++ ist ja keine reine Objektorientierte
Sprache.
Sinnvoll ist es natürlich, platformspezifisches in einer Funktion oder
Klasse zu kapseln.
| Quote: | [...] geht es um die unixspezifische Funktion scandir aus dirent.h.
Da muss sogar free() verwendet werden. Ich habe in sämtlichen
C++-Büchern danach gesucht, wie das Einlesen von Dateien aus
Verzeichnissen funktioniert.
|
Verzeichnisse auflisten geht weder in C noch in C++, denn beide Sprachen
setzen nicht voraus, dass es Verzeichnisse gibt.
Schau dir doch einmal boost filesystem an. Damit müsste das auch gehen.
Boost wäre die typische C++-Lösung die du suchst.
--
Thomas
http://www.netmeister.org/news/learn2quote.html |
|
| Back to top |
|
 |
Andre Poenitz Guest
|
Posted: Tue Dec 12, 2006 3:32 am Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Thiele <thomas.thiele (AT) gmx (DOT) de> wrote:
| Quote: | Und printf benutzt doch keiner freiwillig seit cout.
|
Komisch. Immer wenn ich mehr als eine Sprache habe, brauche
ich eine Art printf-Verschnitt...
Andre' |
|
| Back to top |
|
 |
Tibor Pausz Guest
|
Posted: Wed Dec 13, 2006 3:20 pm Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Barth schrieb:
| Quote: | source.cpp
void Filer::getDirEntries(const char dir[], ofstream &os) {
int numberOfEntries, i;
struct dirent **namelist, **list;
if ((numberOfEntries = scandir(dir, &namelist, 0, alphasort)) > 0) {
for(i = 0, list = namelist; i < numberOfEntries; i++, *list++) {
os << (*list)->d_name << endl;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
Das kann eine Exception werfen -> Speicherloch.
| Quote: | free (*list);
}
free(namelist);
}
}
Wenn der C++-Compiler dies akzeptiert, ist doch alles bestens, oder?
|
Nein, denn der Code ist nicht Exception Safe. Wenn Du einen Wrapper
schreibst, dann sollte dieser den C++ Programmierrichtlinien folgen. Die
weitere Verwendung von namelist und list ist nicht sonderlich gut. |
|
| Back to top |
|
 |
Sascha Bohnenkamp Guest
|
Posted: Thu Dec 14, 2006 4:58 pm Post subject: Re: Vermengung von C und C++ |
|
|
| Quote: | Nein, denn der Code ist nicht Exception Safe.
was sollte in dem C-Code den eine Exception werfen? |
|
|
| Back to top |
|
 |
Andreas Huennebeck Guest
|
|
| Back to top |
|
 |
Hubert Schmid Guest
|
Posted: Fri Dec 15, 2006 3:13 pm Post subject: Re: Vermengung von C und C++ |
|
|
Sascha Bohnenkamp <bohnenkamp (AT) mevisbreastcare (DOT) de> writes:
| Quote: | Nein, denn der Code ist nicht Exception Safe.
was sollte in dem C-Code den eine Exception werfen?
|
Das Beispiel war nicht in C sondern in C++. In dem Code können
insbesondere die beiden operator<<-Aufrufe eine Ausnahme werfen.
--
Hubert Schmid - http://www.z42.de |
|
| Back to top |
|
 |
Markus Wichmann Guest
|
Posted: Fri Dec 15, 2006 8:47 pm Post subject: Re: Vermengung von C und C++ |
|
|
Thomas Thiele schrieb:
| Quote: |
Und printf benutzt doch keiner freiwillig seit cout.
|
Hm... also, als Pascal-Programmierer muss ich sagen, dass ich vom
direkten write[ln]() zum write[ln](Format()) umgestiegen bin. Es lässt
sich einfacher internationalisieren, wenn ich nur einen String mit
Formatierungszeichen habe, als wenn ich 4 Strings habe, zwischen denen
ich Variablen einfüge.
Back to C.
Für den Fall, dass ich mal etwas nicht zu formatieren habe: Was macht
std::cout << "Hello World!" << std::endl;
besser, als
fputs("Hello World!\n", stdout);
? Ich sage: nichts. (Anm: Ich benutze _immer_ fputs(), wenn ich nix zu
formatieren habe. Aus Prinzip. Weil ich sonst fprintf als Stub nutzen
würde (Formatierungs-Funktionalität implementiert und nicht genutzt).
Und ich benutze immer die Datei-Funktionen, weil ich da nicht /hoffen/
muss, dass der Text auf dem stdout landet.)
Ach, ja, warum gebe ich den String in C++ mit std::endl aus? Weil er
sonst nicht angezeigt wird (wegen Pufferung).
Tschö,
Markus
--
Menschen reden den ganzen Tag Unsinn. Sie gehen zum Kühlschrank, machen
ihn auf und fragen: 'Wo ist die Butter?' Ja, wo wird sie sein? Im Kino?
-- Jürgen von der Lippe |
|
| Back to top |
|
 |
Stefan Reuther Guest
|
Posted: Sat Dec 16, 2006 12:23 am Post subject: Re: Vermengung von C und C++ |
|
|
Markus Wichmann wrote:
| Quote: | Thomas Thiele schrieb:
Und printf benutzt doch keiner freiwillig seit cout.
Hm... also, als Pascal-Programmierer muss ich sagen, dass ich vom
direkten write[ln]() zum write[ln](Format()) umgestiegen bin. Es lässt
sich einfacher internationalisieren, wenn ich nur einen String mit
Formatierungszeichen habe, als wenn ich 4 Strings habe, zwischen denen
ich Variablen einfüge.
|
ACK.
| Quote: | Back to C.
Für den Fall, dass ich mal etwas nicht zu formatieren habe: Was macht
std::cout << "Hello World!" << std::endl;
besser, als
fputs("Hello World!\n", stdout);
|
Die Tatsache, dass du recht einfach für std::cout einen anderen Stream
einsetzen kannst: sei es nur ein std::stringstream, sei es ein
LogIntoMyWindowStream, ein NetworkStream oder gar ein GzipStream. Das
ist IMHO ein gewaltiger Unterschied.
Stefan |
|
| Back to top |
|
 |
Markus Wichmann Guest
|
Posted: Sat Dec 16, 2006 10:02 pm Post subject: Re: Vermengung von C und C++ |
|
|
Stefan Reuther schrieb:
| Quote: | Markus Wichmann schrieb:
Back to C.
Für den Fall, dass ich mal etwas nicht zu formatieren habe: Was macht
std::cout << "Hello World!" << std::endl;
besser, als
fputs("Hello World!\n", stdout);
Die Tatsache, dass du recht einfach für std::cout einen anderen Stream
einsetzen kannst: sei es nur ein std::stringstream, sei es ein
LogIntoMyWindowStream, ein NetworkStream oder gar ein GzipStream. Das
ist IMHO ein gewaltiger Unterschied.
|
Und was hindert dich daran, statt stdout einen anderen Dateizeiger zu
nehmen? In C++ musst du AFAIK den GzipStream selbst schreiben. Was
spricht eigentlich dagegen, alles in eine Datei zu schreiben, und dann
gzip drüber laufen zu lassen? Und da der Algo frei ist, kannst du auch
noch selbst das laufen übernehmen. Ich sehe da keine zu großen Nachteile.
Markus
--
Menschen reden den ganzen Tag Unsinn. Sie gehen zum Kühlschrank, machen
ihn auf und fragen: 'Wo ist die Butter?' Ja, wo wird sie sein? Im Kino?
-- Jürgen von der Lippe |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|