C++, stdlib und POSIX
-
Einer der Vorteile von C++ ist, daß einem die C-Welt einfach ohne Verrenkungen offen steht. Ich benötige hin und wieder einige C-Sachen, Hauptsächlich Betriebssystem-API, packe aber C-Aufrufe grundsätzlich in einen C++-Wrapper. Die Fehlerbehandlung läuft dann über Exceptions.
Momentan arbeite ich u.a. an einem Wrapper für shared-memory, semaphoren und memory-mapped-files. Ein C++-Wrapper ist schnell gemacht und ermöglicht es einfach schnelle und robuste Programme zu schreiben.
Im laufe der Zeit haben sich viele solcher Wrapper angesammelt, die ich dann auch immer wieder benutzen kann.
Tntnet
-
@tntnet: Mir kommt es so vor als ob eigentlich jeder das gleiche macht oder machen will, nämlich C-Systemaufrufe schön zu verpacken und nach Möglichkeit alle POSIX Features zu nutzen.
Ich weiß nicht wie es die anderen sehen, aber das was mir fehlt wäre ein OSS Projekt welches genau dieses Ziel verfolgt. Ich vermisse bei den großen Projekten wie boost oder asio leider einige Funktionalitäten die nicht auf allen unterstützen Plattformen zur Verfügung stehen(Windows). Daher habe ich mehr interesse an einer reinen C++ POSIX Bibliothek, am besten noch mit nem Namespace posix.
-
http://www.tntnet.org/cxxtools.hms wäre eine Anlaufstelle.
Oder http://sourceforge.net/projects/pt-framework.
Ich veröffentliche meine Wrapper auch irgendwann, wenn sie reif genug sind.
Wenn Du (oder jemand anderes) Interesse hast, mitzuhelfen, dann melde Dich einfach.
Tntnet
-
Naja, einerseits meckerst du, das du alles selber verpacken mußt, andererseits willst du nicht Boost verwenden. Versteh ich nicht. Ich nehme das was fertig ist, und baue höchstens das was noch fehlt. Du machst das nicht. Du meckerst über beide Varianten.
Warum willst du nicht z.B. boost.asio benutzen? Es deckt doch netzwerk-Basics ab. Auch boost.filesystem erledigt vieles. Wenn du was ganz spezielles aus POSIX brauchst, baust du das halt in einen eigenen Wrapper oder suchst im Netz nach ferigen Sachen.
Übriegens, POCO gibt es auch noch. http://appinf.com/poco/ Wird dir aber wahrscheinlich auch nicht passen?
Fehlt wahrscheinlich irgendwas... wetten.
-
BSD'ler schrieb:
wollte aber auf Boost verzichten und mir lieber eigene kleine Wrapper für die Systemfunktionen schreiben.
Ne, mal ehrlich. Auf Boost möchte ich beim täglichen C++ programmieren nicht verzichten. Sicher ist es nicht der ideale Wrapper für Systemfunktionen (da es eben doch zu allgemein ist). Aber allein Dinge wie die Smartpointer, ptr-Container, regex, function, tuple usw usw sind einfach nur extrem praktisch.
-
Ich möchte an dieser Stelle mal kurz auf Objective-C hinweisen!
C++ ist aufgrund seiner weiten Verbreitung und dem grossen Support anderer Entwickler wohl klar im Vorteil. Objective-C ist meines erachtens aber zu unrecht verkannt. In C und Objective-C zu schreiben ist überhaupt kein Problem. Man kann problemlos die Vorteile einer objektor. Sprache nutzen und jederzeit wieder nach C zurückkehren.
Schreibt noch einer hier in Objektive-C?Gruss
Michael
-
@tntnet: Danke, werde ich mir mal in Ruhe angucken!
rüdiger schrieb:
BSD'ler schrieb:
wollte aber auf Boost verzichten und mir lieber eigene kleine Wrapper für die Systemfunktionen schreiben.
Ne, mal ehrlich. Auf Boost möchte ich beim täglichen C++ programmieren nicht verzichten. Sicher ist es nicht der ideale Wrapper für Systemfunktionen (da es eben doch zu allgemein ist). Aber allein Dinge wie die Smartpointer, ptr-Container, regex, function, tuple usw usw sind einfach nur extrem praktisch.
Hi rüdiger, mir ging es bei dem Satz ausschließlich um die Systemaufrufe und da im speziellen um systemabhängige Themen wie Threads und ganz besonders Sockets.
Artchi schrieb:
Naja, einerseits meckerst du, das du alles selber verpacken mußt, andererseits willst du nicht Boost verwenden. Versteh ich nicht. Ich nehme das was fertig ist, und baue höchstens das was noch fehlt. Du machst das nicht. Du meckerst über beide Varianten.
Es ist die Realität! Boost ist schön und kann einiges, aber es gibt sehr viele Bereiche die überhaupt nicht abgedeckt werden. Oder kann boost mittlerweile zip, xml, png, Verschlüsselungsalgorithmen, etc.? Bei C habe ich die Probleme nicht, da es die benötigten Bibliotheken auf nahezu jedem System bei default. Ich möchte nicht dem Benutzer einen "Haufen" zusätzlicher Abhängigkeiten vorwerfen!
Artchi schrieb:
Warum willst du nicht z.B. boost.asio benutzen? Es deckt doch netzwerk-Basics ab. Auch boost.filesystem erledigt vieles. Wenn du was ganz spezielles aus POSIX brauchst, baust du das halt in einen eigenen Wrapper oder suchst im Netz nach ferigen Sachen.
Wie Du schon sagtest, Netzwerk-Basics. Derzeit bastel ich an einer OSPF Implementierung und genau da liegt mein Problem. Bevor ich mir einen Wrapper um einen Wrapper schreibe, schreibe ich lieber einen Wrapper um die Systemfunktionen. Das dauert nicht länger und macht genau das was ich will!
Artchi schrieb:
Übriegens, POCO gibt es auch noch. http://appinf.com/poco/ Wird dir aber wahrscheinlich auch nicht passen?
Fehlt wahrscheinlich irgendwas... wetten.
Das sieht wirklich auf den ersten Blick sehr gut aus! Werde ich mir gleich nächste Woche in Ruhe angucken. Besten dank für den Link! Hast Du schon Erfahrungen damit gesammelt?
Zu Deinem zweiten Satz: Solange Du nicht weißt um was es geht, kannst Du es wohl kaum beurteilen.
Oder hast Du schonmal mit Boost Sockets eine OSPF Daemon geschrieben?
-
@BSD'ler!
So, jetzt nochmal in Ruhe wie ich das sehe. Du erwartest das jemand alle möglichen C-Libs, die DU willst, in EINEN C++-Download DIR zur Verfügung stellt.
Fällt dir was auf?
Du hast ein Verständnisproblem bzgl. C-Libs und C++-Libs.
1. POSIX ist eine System-API die in C designed wurde. Das Problem ist, das jetzt jemand sich hinsetzen müsste, und POSIX gescheit in ein OO-Konzept ummodeln müsste. Das macht aber sehr wenig Sinn. Zumindest scheint das bisher niemandem in den Sinn gekommen zu sein. Warum? Weil POSIX nur auf POSIX-Systemen funktioniert. Folge? Wenn jemand in Boost einen C++-POSIX-Wrapper baut, kann man ihn z.B. nicht unter Windows, Amiga, RISC OS usw. sinnvoll einsetzen. Warum? Weil das nicht mehr Platformneutral wäre.
Libs wie Boost versuchen entweder allgemeine Probleme zu lösen, die Systemunabhängig sind, z.B. Regex, Smartpointer usw. ODER sie versuchen System-Funktionen über einen gemeinsamen Nennen bereit zustellen. Beispiel wäre die Boost.Filesystem-Library. In dieser wirst du vieles finden, was auf jeder Platform funktioniert. Du wirst aber z.B. über Boost.Filesystem keine Dateirechte o.ä. setzen können. Warum? Weil z.B. Windows und Linux/Unix diese Dinge völlig unterschiedlich beahndeln (vom Konzept her). Auch Java (die propagierte System-neutrale Technologie) kann keine Dateirechte setzen oder lesen.
Du wirst sowas spezielles nicht finden. Weil man bei System-neutralität immer Kompromisse eingehen muß, um deinen Source überall zum laufen zu bekommen.
2. Du sagst, Boost hat kein Zip, XML usw. Ich frage mich, warum Boost sowas anbieten soll? Was hindert dich daran Boost zu nehmen, und wenn du XML verarbeiten willst, nicht Apaches http://xml.apache.org/xerces-c/ nimmst? Glaubst du etwa, das die C-Programmierer sich nicht von hier und von dort bedienen? Ich habe noch nie gehört, das Linux oder Unix XML mitbringen. Sie benutzen XML vielleicht, und das aus einer XML-Lib, die irgendjemand geschrieben hat.
Wenn du eine C++ Zip Library brauchst, solltest du einfach mal in google "C++ ZIP" eingeben. Und nimmst das, was die symphatisch erscheint. Oder warum nicht einfach http://www.zlib.net/? Glaubst du nicht, das zlib irgendwo in Linux oder BSD benutzt wird? Boosts Serialization-Library benutzt übrigens zlib. Warum? Weil ich dann als User einfach meine C++ Objekte über Boosts Serialization rausschreibe und Boost.Serialization diese gleich komprimiert. Ich komme mit der C-API von Zlib erst garnicht in Berührung, also brauche ich keinen Zlib-C++-Wrapper.PNG? Willst du Bilder nicht nur laden und evtl. bearbeiten/manipilieren? http://opensource.adobe.com/gil/ ist eine geniale C++ Bildmanipulations-Lib direkt von Adobe! GIL nutzt http://www.libpng.org und Boost! Komisch, oder? Man bastelt sich seine Infrastruktur aus den besten Komponenten zusammen!!! So macht man das. Niemand bietet eine komplette Lösung an, die alle Probs der Welt löst. Warum sollte Adobe eine eigene C++-PNG-Lib proggen, wenn libpng.org seinen Zweck vorzüglich erfüllt? Übrigens kommst du auch hier, als C++ler mit der libpng nicht in Berührung, da dies GIL für dich macht.
Du siehst, vieles läuft auch konzeptmäßig anders ab. Vieles braucht man als C++-Variante nicht.
Fazit: man kann es sich schwer machen, wenn es auch einfacher geht!
-
Hier mal ein Link:
Boost.Serialization: http://www.boost.org/libs/serialization/doc/
Boost.asio: http://asio.sourceforge.net/Leider kenne ich mich mit Netzwerken kaum aus, weiß nicht was du implementieren willst. Schau dir asio trotzdem mal an.
Ansonst ist wie gesagt auch POCO einen Blick wert. Such dir das zusammen, was du braucht. Kombiniere auch ruhig, da wo es möglich ist.
-
http://www.ospf.org/ tztz