std::string plattformunabhängig?



  • Probeleme können z.B. auftreten, wenn man einen std::string an Interface-Übergängen (z.B. DLL zu Exe) übergibt. Da muss man (meistens) dann auf einen rohen "char*" zurückgreifen, da es - wie gesagt - unterschiedliche Implementierungen von std::string gibt.



  • std::string ist std::basic_string<char>.
    Weder "std::basic_string" noch "char" sind wirklich 100% plattformunabhängig.
    char kann 8 Bit sein, oder 12, oder 16, oder irgendwas >=8, char kann signed sein oder unsigned...

    Genauso kann sich stark unterscheiden was std::basic_string<char>::size_type für ein Typ ist (und welchen Wertebereich dieser Typ hat) etc.

    Die Frage ist also was man unter plattformunabhängig versteht.



  • Das bedeutet eigentlich, dass man nur char* nehmen kann, wenn man absolut sicher sein will, dass der Code auf jedem beliebigen System läuft ( entsprechender Coompiler ) ?

    Wir kamen zu dem Thema durch die Diskussion über den Nutzen von Java ( die alte Java vs. C++ Geschichte... ). Und so kamen wir auf die Plattformunabhängigkeit von C++ zu sprechen.



  • it0101@loggedoff schrieb:

    Das bedeutet eigentlich, dass man nur char* nehmen kann, wenn man absolut sicher sein will, dass der Code auf jedem beliebigen System läuft ( entsprechender Coompiler ) ?

    Das bedeutet eigentlich, dass man nur char* übergeben darf, wenn der Code auf jeder Plattform mit anderem Code interoperabel sein soll. Was Du intern in Deinem Code verwendest, ist schnurz, solange die Standardbibliothek konform ist.



  • Nein, der C++-Code läuft auf jeder CPU, du musst ihn nur dafür kompilieren. Natürlich wird deine windows-exe so erstmal nicht auf linux laufen, während dein Java Byte-Code auf allen Plattformen gleich läuft.



  • Decimad schrieb:

    ...während dein Java Byte-Code auf allen Plattformen gleich läuft.

    Naja - eigentlich auch das nicht. Der läuft auch nur auf der Plattform "Java-VM"...
    Wenn Du unter Linux eine Windows-VM startest, läuft da auch Deine windows.exe (natürlich vorausgesetzt, Deine exe ist zur Windows-VM kompatibel ... aber das gilt für Java ebenso). :p 😉

    Gruß,

    Simon2.



  • Was war an "so erstmal nicht" und "byte-code" für jemanden, der weiß, was ich damit meine (weil er es mir ja erklären kann) so unklar 🙂



  • Was heisst denn in diesem Fall "plattformunabhängig"?
    Soll das Programm sich nur auf unterschiedlichen Plattformen kompilieren lassen und das gleiche Verhalten zeigen? Das sollte so sein, egal welche Größe oder welches Vorzeichen char hat, oder wie std::basic_string implementiert ist.

    Oder sollen zwischen verschiedenen Plattformen Daten ausgetauscht werden? Über Netzwerk oder Dateien z.B.? Dann sieht die Sache schon anders aus, aber das weisst Du vermutlich auch schon. In dem Fall sollte man sich entweder um eine plattformunabhängige Serialisierung bemühen (was nicht gerade einfach ist), oder alles als ASCII abspeichern.



  • Decimad schrieb:

    Was war an "so erstmal nicht" und "byte-code" für jemanden, der weiß, was ich damit meine (weil er es mir ja erklären kann) so unklar 🙂

    Marketing-Lügen muss man einfach entschlossen mit Fakten entgegentreten, wo immer sie ihr schmuddeliges Haupt erheben! 😉

    Gruß,

    Simon2.



  • Die Sprache ISO-C++ und dessen Standard-Bibliothek (dazu gehört std::basic_string) ist grundsätzlich plattformneutral. Man wird in der ISO-Spezifikation keine plattformabhängigen Eigenschaften finden. Auch char ist plattformneutral. Das sieht man doch schon daran, das sich die ISO-Specifikation um eine genaue Defintion "drückt". 😉



  • Bulli schrieb:

    ...auch char ist plattformneutral. Das sieht man doch schon daran, das sich die ISO-Specifikation um eine genaue Defintion "drückt". 😉

    Weshalb char alles mögliche sein kann, und eben nicht plattformneutral ist. char definiert sich über den "Basic Character Set", und der ist "implementation defined".
    Es hängt aber, wie bereits gesagt, davon ab, was hier mit "plattformunabhängig" gemeint ist.



  • Ich weiß ja nicht, ob das überhaupt so sinnvoll ist. Ich meine, Leute die für irgendwelche abstrusen anderen Plattformen programmieren, wissen doch oftmals, was sie tun und worauf sie zu achten haben. Leute die kaum Ahnung haben (*vollerschamaufdenbodenschau*) arbeiten meist auf den verbreiteten Plattformen, auf denen man wieder davon ausgehen kann, dass das alles irgendwie gleich implementiert ist und bekommen aber keine klare Ansage. Am Ende typedef't sich dann wieder jedes größere Projekt seine eigenen Typen.



  • Decimad schrieb:

    Ich weiß ja nicht, ob das überhaupt so sinnvoll ist. Ich meine, Leute die für irgendwelche abstrusen anderen Plattformen programmieren, wissen doch oftmals, was sie tun und worauf sie zu achten haben. Leute die kaum Ahnung haben (*vollerschamaufdenbodenschau*) arbeiten meist auf den verbreiteten Plattformen, auf denen man wieder davon ausgehen kann, dass das alles irgendwie gleich implementiert ist und bekommen aber keine klare Ansage. Am Ende typedef't sich dann wieder jedes größere Projekt seine eigenen Typen.

    Grundsätzlich ist es völlig Wumpe, wie ein Typ intern behandelt wird. Wir haben hier DSP's (Digitale Signal Prozessoren), bei dem die kleinste adressierbare Einheit 32 Bit ist. Da ist sizeof(char) (ist laut Standard immer 1) == sizeof(int).
    Obwohl dem so ist, verhalten sich standardkonforme Programme sowohl auf einem Windows-PC als auch auf dem DSP grundsätzlich erstmal gleich.
    Problematisch wird es erst, wenn man Daten vom DSP zum Windows-Rechner schieben will (oder umgekehrt). Für solche Probleme gibt es z.B. IDL, welches für austauschbare Typen sorgt.



  • Ja hrmm, da gebe ich dir natürlich recht. Spätestens beim Serialisieren muss man sich dann aber Gedanken drüber machen (oder man nimmt eine xml-Bibliothek her). Aber bei dem ganzen Wust von utf-8, utf-16, multi-byte-chars, chars, wchars, kombination mit std::string wird es dann für mich doch unübersichtlich. Und solche benutzt man doch fast immer um aus String-Tables entsprechende Nachrichten für den Benutzer zu präsenteren. Vielleicht ist das aber auch nur eine Tücke der MSDN, aus der ich da oft versuche, die nötigen Informationen zu quetschen.)



  • Decimad schrieb:

    ...Spätestens beim Serialisieren muss man sich dann aber Gedanken drüber machen ...

    Auch nichtmal unbedingt - es spricht nichts dagegen, zu serialisieren, ohne die jeweilige Plattform zu kennen. Erst, wenn man auf ein bestimmtes plattformspezifisches Protokoll hinaus will (bestimmte Anzahl an Bytes, ein bestimmter Zeichensatz, ...), wird's eben plattformspezifisch.

    Tachyon schrieb:

    ...Problematisch wird es erst, wenn man Daten vom DSP zum Windows-Rechner schieben will (oder umgekehrt). ...

    Oder anders ausgedrückt: Problematisch wird's erst dann, wenn man plattformspezifische Aufgaben erledigen bzw. plattformspezifische Aussagen treffen will.... leider zählt hierbei zur "Plattform" auch der konkrete Compiler.
    Das ist für mich das größte Manko am C++-Standard: Der fehlende "Kompatibilitätsmodus" (auch wenn ich selbst nicht wüsste, wie man den sinnvoll definieren könnte), der wenigstens die Compiler/Linker untereinander kompatibel macht.

    Gruß,

    Simon2.



  • Weshalb char alles mögliche sein kann, und eben nicht plattformneutral ist. char definiert sich über den "Basic Character Set", und der ist "implementation defined".

    ist doch vollkommen irrelevant was der char nun byte und groessentechnisch ist ...
    solange das System / die Api, die ebenfalls plattformunabhaengig ist, dazu passend das ding verarbeiten kann.

    Es gibt sogar ne ganze menge structs in lowlevel funktionen, die sind plattformunabhaengig, obwohl man sie sich auf jeder plattform anders definieren. Solange man ned selber den inhalt auswertet sondern die mitgeleiferten funktionen verwendet.
    Wuerde das ned funktionieren, wuerde man fast gar keine plattformunabhaengigkeit haben oder ???

    mann sollt plattformunabhaengig ned mit binaercompatibel verwechseln ....

    Ciao ...



  • @RHBaum und andere die meinen das sei alles so einfach,
    es gibt auch Programme die mehr tun als nur Texte rumzuschieben. z.B. irgendwas zu rechnen.
    Oder irgendwelchen Protokolle zu implementieren.

    Da ist es dann schnell sehr wichtig wie gross char ist, oder wie gross int ist etc.



  • hustbaer schrieb:

    @RHBaum und andere die meinen das sei alles so einfach,
    es gibt auch Programme die mehr tun als nur Texte rumzuschieben. z.B. irgendwas zu rechnen.
    Oder irgendwelchen Protokolle zu implementieren.

    Da ist es dann schnell sehr wichtig wie gross char ist, oder wie gross int ist etc.

    Wer aber sowas implementiert, wird auch soviel Knowhow haben, einen bestimmten Datentyp zu wählen, notfalls per typedef .



  • Bulli schrieb:

    hustbaer schrieb:

    @RHBaum und andere die meinen das sei alles so einfach,
    es gibt auch Programme die mehr tun als nur Texte rumzuschieben. z.B. irgendwas zu rechnen.
    Oder irgendwelchen Protokolle zu implementieren.

    Da ist es dann schnell sehr wichtig wie gross char ist, oder wie gross int ist etc.

    Wer aber sowas implementiert, wird auch soviel Knowhow haben, einen bestimmten Datentyp zu wählen, notfalls per typedef .

    Nur leider gibt es auch noch was anderes, als Hobyentwickler, die alles selber bauen. Wenn man an Softeareteilen in größeren Teams mit vllt. 10 Leuten arbeitet, und das ganze dann noch von anderen Teams benutzt werden soll, und das ganze dann vllt. noch zwischen verschiedenen Plattformen hin und her geschoben werden muss, dann reicht etwas Know-How nicht mehr aus. Dann muss man sich schon sehr genau Gedanken bei der Spezifikation der Schnittstellen machen, oder Frameworks benutzen, die einem die Definition von Interplattform-Schnittstellen erlauben, wie z.B. IDL+CORBA.



  • Und? 😕


Anmelden zum Antworten