Makro für char * Ersetzung?
-
Ich hab hier alten C code in einer foo.h/.c Sammlung und inkludiere den in mein Projekt: Nun meine Frage, ist es möglich durch ein Preprozessor Makro die Vorkommen von char * durch etwas anderes zu ersetzen?
Ich meine nicht per Hand, sondern so automatisch wie möglich.
Ferner frage ich dies nicht in für einen bestimmten Compiler oder IDE (Win/Linux) sondern so allgemein wie möglich.
Grund ist: Ein externer Generator generiert automatisch den C Code von da oben, den kann ich nicht ändern, würde aber gerne char * durch etwas moderneres ersetzen

Und per Hand ist nicht, weil jeder andere, der es neukompilieren würde, würde es trotz erweiterter Doku nicht per Hand ersetzen. (Läuft hier so...)
-
Geht nicht. Und an automatisch generiertem Code sollte man auch nie rumbasteln.
-
Du müsstest ja nur nicht die Deklarationen ändern, sondern viele Funktionsaufrufe usw. Das ist erstens nicht per Makro zu realisieren und zweitens auch eine in meinen Augen leicht übertriebene Intention. Wenn man schon dazu gezwungen wird, dann kann man doch gut mit char-Pointern leben. So schlim sind die auch nicht, oder?

-
Wenn der C - Code "fehlerfrei" ist, dann spielt es doch keine Rolle. Dann kannst du durchaus char* drin lassen. (Nicht ohne Grund wird ja für std::string auch c_str() angeboten. Weil eben viel auf char* basiert und, wenns richtig gemacht ist auch nichts schlechtes ist.)
-
Ich hab ein c struct mit char * drin, ich würd das ganze gerne nicht per Hand managen und ein auto_ptr mit dem struct ist zwar cool, bringt mir aber bei nem struct mit nem char * unfun, wenn du verstehst

-
Seikilos schrieb:
... unfun, wenn du verstehst

Kein Stück.
-
auto_ptr löscht sich selbst, ergo wird das struct korrekt dealloziiert, aber nicht der char * im struct, das bedeutet also leak
-
Seikilos schrieb:
auto_ptr löscht sich selbst, ergo wird das struct korrekt dealloziiert, aber nicht der char * im struct, das bedeutet also leak
Ich verstehe Dein Problem eher ganz Grundsätzlich nicht. Ich denke mal, dass es sich immer noch um die gleiche Sache handelt, wegen der Du auch die letzten paar Threads eröffnet hast.
In einem der Threads wurde mal nach mehr Infos zu der Sache gefragt. Aber da ist bis jetzt nichts rübergekommen.
-
Oh, ich meinte, dass ich es mal getan habe.
Wir haben alte XDR Daten und einen RPC Gen von Sun, dieser ist in C geschrieben und wirft dementsprechend halt alte C structs aus, wo ein char * das hächste der Gefühle ist. Diese Daten können und dürfen nicht geändert werden, weil sie ständig neu generiert werden.
Ich soll nun damit arbeiten, habe jedoch wenig Interesse mich mit den Pointern rumzuschlagen, daher plane ich, das alte C in aktuelleres C++ mit allen Annehmlichkeiten zu ändern. Da ich jedoch nicht die Daten selber ändern kann, muss ich einen Umweg suchen, wie ich so viel wie Möglich mit auto_ptr oder falls es in container geworfen wird mit boost::shared_ptr zu packen und so weiter, sprich vector oder alles andere, was STL bietet.Wrappen ist ein Weg, führt jedoch zu einer Kappselung von über 40 structs, worauf ich keine lust habe.
Daher such ich eine Methode, wie ich die C structs vorverarbeiten kann, um damit vernünftig zu arbeiten, sich nicht um soviel Speicher zu kümmern und am Ende noch die gleiche Funktionalität bieten zu können
-
Seikilos schrieb:
...
Gibt es zu den Structs denn auch noch alte Funktionen, die damit arbeiten? Nur die Strukts für sich erscheinen mir etwas sinnbefreit, zumal das ganze anscheinend schon eine ganze Weile existiert.
-
Die Structs werden von dem Sun RPCGen in komplexen Funktionen verbraten, um diese zu Speichern und zu Laden, da wird dann noch ne Menge drauf gearbeitet.
-
Ich habe keine Ahnung, was RPCGen ist, aber wird beim Laden nicht auch Speicher für die char* allokiert?
-
Ja, das macht der RPC intern, der hat ein paar wuchtige Methoden dafür
-
Dann kapsel die Strukts doch mitsamt der Methoden weg. Das spart ordentlich Arbeit.
-
Interessant wäre für mich noch ein Weg, dies generisch zu machen, wobei C++ ohne Reflection und Interospection hier wohl nicht so gefügig gemacht werden kann, wie ich es gerne hätte