Können Sie ein eingefügtes Token in einem Makro groß schreiben?

Lesezeit: 3 Minuten

Ist es in einem C-Makro möglich, ein eingefügtes Token groß zu schreiben? Aktuell habe ich z.B. folgendes Makro:

#define TEST(name, keyword) \
    test_##name:
        TEST_##keyword##_KEYWORD

Ich würde dies wie folgt aufrufen:

TEST(test1, TEST1)

was folgendes ergeben würde:

test_test1:
    TEST_TEST1_KEYWORD

Anstatt denselben Namen zweimal eingeben zu müssen (einmal mit allen Kleinbuchstaben und erneut mit allen Großbuchstaben), gibt es eine Möglichkeit, eine der folgenden Aktionen auszuführen und entweder das Token in alle Großbuchstaben zu ändern oder alles Kleinbuchstaben?

TEST(test1) or TEST(TEST1)

Danke, Ryan

  • Ich habe sehr große und alte Codes gesehen, die viele Wörter in Klein- und Großbuchstaben wiederholen, um das zu erreichen, was Sie wollen. Ich würde daraus schließen, dass dies nicht möglich ist.

    – Nils_M

    5. April 2016 um 12:04 Uhr

Benutzeravatar von Michael Burr
Michael Burr

Soweit mir bekannt ist, besteht die einzige Operation, die mit Token im C-Präprozessor (zumindest ISO/ANSI-Standard) ausgeführt werden kann, darin, sie zu ersetzen, zu „stringifizieren“ oder zu verketten. Mir sind auch keine GCC- oder MSVC-Erweiterungen bekannt, mit denen Sie tun können, was Sie wollen.

Allerdings haben sich die Leute clevere (oder seltsame) Wege ausgedacht, um magische (oder schreckliche) Dinge mit Makros zu tun, also wäre ich nicht überrascht, wenn mich jemand überrascht.

  • Danke Michael. Das ist so ziemlich das, was ich erwartet hatte, aber ich hatte gehofft, dass mich auch jemand überraschen könnte. =)

    – DuneBug

    3. August 2010 um 20:38 Uhr

Sie könnten so etwas tun (ungetestet, wahrscheinlich Tippfehler …)

#define NORMALIZE(TOK) NORMALIZE_ ## TOK

und dann für jede der Schriften, die auftreten können

#define NORMALIZE_test1 test1
#define NORMALIZE_TEST1 test1

dann benutze die NORMALIZE Makro in Ihrem echten Makro so etwas wie

#define TEST(name, keyword)                    \
    test_ ## NORMALIZE(name):                  \
        TEST_ ## NORMALIZE(keyword) ##_KEYWORD

(Aber vielleicht müssten Sie einige Hilfsmakros ausführen, bis Sie alle Verkettungen richtig gemacht haben.)

  • Ha! Ha! Du hast es falsch gemacht… will er TEST(name) also hättest du #define NORMALIZE_TEST1_UPPER TEST1 und dann #define NORMALIZE_TEST1_LOWER test1 dann verwenden Sie TEST mit der Großbuchstabenversion: TEST(TEST1). (Sie könnten natürlich dasselbe mit Kleinbuchstaben machen, hängt davon ab, wie Sie Ihre nennen möchten TEST() Makro.)

    – Alexis Wilke

    17. August 2014 um 3:28 Uhr

Dies ist nicht möglich, da der Präprozessor mit einem Eingabestrom von arbeitet pp-token und hat kein Konstrukt, mit dem Sie diese sinnvoll zerlegen können.

Was der Präprozessor zu ersetzen hat, sind Konstrukte pp-tokens mit Makroerweiterungen, verketten sie, entfernen sie (ganz) usw.

Das bedeutet, dass Ihre einzige Hoffnung für die Großschreibung darin besteht, mit einzelnen Zeichen zu beginnen und diese groß zu schreiben und dann alles zusammenzukleben. Das Großschreiben einzelner Zeichen ist ziemlich einfach, da Sie nur eine endliche Menge haben, mit der Sie arbeiten können. Zusammenkleben wäre dagegen möglich, zumindest wenn man sich auf eine feste Maximallänge beschränkt. Sie würden in einem Makro enden, das wie folgt verwendet würde:

TEST(t,e,s,t,1)

1394730cookie-checkKönnen Sie ein eingefügtes Token in einem Makro groß schreiben?

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

Privacy policy