Erweitern Sie Makros innerhalb einer Zeichenfolge in Anführungszeichen [duplicate]

Lesezeit: 2 Minuten

Benutzeravatar von davide
David

Mögliches Duplikat:

C-Makros zum Erstellen von Zeichenfolgen

Ich habe eine Funktion, die ein Argument des Typs akzeptiert char*wie f("string");

Wenn das String-Argument nebenbei im Funktionsaufruf definiert wird, wie können Makros innerhalb des String-Körpers erweitert werden?

Zum Beispiel:

#define COLOR #00ff00
f("abc COLOR");

wäre gleichbedeutend mit

f("abc #00ff00");

stattdessen wird die Erweiterung nicht durchgeführt, und die Funktion erhält wörtlich abc COLOR.

Insbesondere muss ich das Makro genau erweitern \"#00ff00\"sodass dieses in Anführungszeichen gesetzte Token mit dem Rest des übergebenen Zeichenfolgenarguments verkettet wird f(), Anführungszeichen enthalten; Das heißt, der Präprozessor muss seine Arbeit beenden und den Compiler begrüßen, der den Code umwandelt f("abc COLOR"); zu f("abc \"#00ff00\"");

  • Der Präprozessor berührt keine Zeichenfolgenliterale.

    – alk

    18. Oktober 2012 um 16:11 Uhr

  • stackoverflow.com/questions/798221/c-macros-to-create-strings

    – Singpolyma

    18. Oktober 2012 um 16:17 Uhr

Benutzeravatar von tomahh
Tomahh

Sie können Makros in Zeichenfolgen nicht erweitern, aber Sie können schreiben

#define COLOR "#00ff00"

f("abc "COLOR);

Denken Sie daran, dass diese Verkettung vom C-Präprozessor durchgeführt wird und nur eine Funktion zum Verketten von einfachen Zeichenfolgen ist, nicht von Variablen oder so.

  • Ist dies gleichbedeutend mit der Übergabe von 2 Argumenten an f() ?

    – davide

    18. Oktober 2012 um 16:11 Uhr

  • @davide nein, wenn Sie zwei Zeichenfolgenliterale nebeneinander setzen, verkettet der C-Compiler sie.

    – Singpolyma

    18. Oktober 2012 um 16:12 Uhr

  • Nein, die Strings werden vom Compiler verkettet. Zur Kompilierzeit ergibt die Zeichenfolge “abc #00ff00”.

    – Tomahh

    18. Oktober 2012 um 16:13 Uhr

  • Ich glaube an die Verkettung "abc ""#00ff00" zu "abc #00ff00"wird vom Compiler statt vom Präprozessor ausgeführt. gcc.gnu.org/onlinedocs/cpp/Stringification.html Hinweis im zweiten Absatz: The preprocessor will replace the stringified arguments with string constants. The C compiler will then combine all the adjacent string constants into one long string.

    – Barun

    14. August 2014 um 7:01 Uhr

#define COLOR "#00ff00"
f("abc "COLOR);

  • Ich denke, es ist erwähnenswert, dass dies funktioniert, weil C zwei Zeichenfolgen “automatisch verkettet”, wenn sie ohne etwas dazwischen erscheinen.

    – phimuemue

    18. Oktober 2012 um 16:23 Uhr

1395230cookie-checkErweitern Sie Makros innerhalb einer Zeichenfolge in Anführungszeichen [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy