String concat in Macro
-
Hi Leute,
Ich möchte in einem Makro C-Strings aneinanderfügen. So in etwa in der folgenden Form:
Übergabewert Text Makro
Ich muss dabei mit 2 bereits vorhandenen Macros arbeiten, da ich "einfach nur" die Macros erweitern möchte. Die 3 Teile sind also folgende:
1. Übergabewert: Der Parameter, der an das Makro übergeben werden soll.
2. Text: Ein Standardtext, der immer gleich bleibt.
3. Makro: Makroaufruf aus unserer BibliothekBisher habe ich es wie folgt versucht:
#define A(übergabe) B(übergabe " Text " C())
Nochmal zur Erklärung:
A ist mein eigenes Macro. B und C sind Macros aus unseren Bibliotheken. Hinter C stehen weitere Makros die irgendwann in einer Funktion enden. Rückgabewert dieser Funktion hinter C ist "char*". B erzeugt anhand des übergebenen Strings eine Ausgabe.( Hoffe das ist verständlich
)
Mein Problem ist jetzt also ganz allgemein gesagt:
Aus
#define A(übergabe) B(übergabe " bar")
würde, wenn übergabe=foo ist, an B
foo bar
übergeben. Habe ich getestet. Funktioniert.
Allerdings scheint es jetzt Probleme mit diesem weiteren Macroaufruf zu geben. Der einzige Unterschied den ich erkenne ist, die ersten 2 String-Literale sind in "" geschrieben und der Rückgabewert der Funktion hinter dem Macro C ist "char*". Kam hier jemand mit und kann mir vielleicht sagen, wie ich das machen kann?Ich hoffe mal, ich hab auch nicht so durcheinander gebracht wie mich.
Bei fragen fragt ruhig
Lg Marius
-
Wenn du in Makros String-Literale aneienanderfügen willst, dann benutze ##:
#define A(x, y) x ## y
Wenn du aber Funktionen dort aufrufst, so mußt du dies dann auch zur Laufzeit lösen, d.h. z.B. mittels Aufruf von strcat() o.ä.
-
Hi. Erstmal danke für die Antwort.
Allerdings hat jetzt noch eine Info gefehlt. B() wird letztlich auch zu einem Funktionsaufruf. Das ganze generiert also eigentlich nur einen Funktionsaufruf.
B -> func_B() Rückgabe: void Funktion: Ausgabe in Log-Datei
C -> func_C() Rückgabe: char* Funktion: Rückgabe eines kurzen String zur Information über den aktuellen FunktionsudurchlaufesA -> Sozusagen ein Macro zur Verschönerung dieser Ausgabe
Ich habe das bisher im Code mit den folgenden 3 Zeilen gelöst:
const char c[100] = "foo bar";
strcat(c, C());
B(c);foo ist also wieder mein Übergabewert. Da es an dieser Stelle noch immer spezifisch für diese Funktion geschrieben wird, kann es direkt im Quelltext geändert werden.
Da das zu umständlich ist, bin ich zur Zeit auf der Suche nach einer verkürzten, einfacheren Form.Wie man sieht, habe ich auch bereits an strcat gedacht. Aussehen würde das bei mir so:
#define A(c) B(strcat(strcat(c, " bar "), C()));
Das gibt aber einen Laufzeitfehler: der Aufruf A("foo") wird nicht funktionieren. c wäre dann zu klein.
Ich muss den String also immer noch vorher anlegen.Sieht also so aus.
char d[100] = "foo";
A(d);Hat vielleicht jemand eine Idee, wie ich die Zeile auch noch los werde. Meines Wissens nach gibt es keine Stringfunktion, die eine eigene Ergebnisvariable anlegt.
Da fällt mir nur die Möglichkeit ein, die Funktion zu "wrappen". Bedeutet also: Parameter kopieren und strcat an Kopie aufrufen ...Lg
-
Solange du keine Makro-Operationen (# bzw. ##) benötigst, kannst du doch einfach eine Funktion dafür schreiben und dir mit malloc (und strlen) genügend Speicher besorgen und dann strcat aufrufen.
-
Ok. Hatte eigentlich gedachte/gehofft, dass ich es mit Makros zusammengebaut bekomme. Naja ich probier mal ein bisschen weiter rum. Ansonsten muss es eben mit einer kleinen Funktion gemacht werden.
Leider kommen dann bei C() noch ein paar Bedingungen hinzu, die bedeuten, dass ich nicht zu tief aus der Funktion raus darf. Daher auch diese komischen Makro, auf Makro, auf Makro Definitionen...
Danke trotzdem