Frage

Zum Beispiel ist Folgendes möglich:

#define definer(x) #define #x?
War es hilfreich?

Lösung

Obwohl die Syntax ungültig ist, ist die Antwort auf Ihre Frage ja technisch. Aber es kann nur durch fiese Tricks erreicht werden, die den Code nicht lesbar und wartbaren machen.

Siehe auch: http://www.ioccc.org/years.html#1995_vanschnitz und http://www.ioccc.org/years.html#2004_vik2

Andere Tipps

Nein, Sie können das nicht tun.
Das Pfund (#) Symbol hat eine andere Bedeutung, während in einer Definition. es bedeutet -. Wenn dies ein Argument ist, es mit einem Zitat ihm einen String machen

Sie können nicht C Präprozessordirektiven Nest. Zum Glück ist es so gut wie nie nötig. Wenn Sie wirklich diese Art von Macht brauchen, werden Sie fast sicherlich besser dran mit einem anderen Prä-Prozessor, die Sie ausführen, bevor Sie den Code an den C-Compiler Gabe ab. Zum Beispiel:

sed 's/@CUSTOMER@/J. Random Person/' foo.c.in > foo.c
cc foo.c

Ein weiterer nützlicher Trick ist, die Tricks in eine einzige Header-Datei zu isolieren, das ist erzeugt durch ein Programm, das Sie selbst schreiben:

./generate-trickery --greet 'J. Random Person' > foo.h

wo foo.h wie etwa wie folgt aussehen:

#define GREET(x) ("J. Random Person greets you, " #x)

Wenn Sie diese binden zusammen mit einem Makefile oder einer anderen Automatisierung, wird es ziemlich nahtlos und Ihre Entwicklung viel nicht stolpern.

Nein, Sie können das nicht tun.

Sie können ein Makro von einem anderen Referenz, aber man kann nicht ein Makro von einem anderen definiert werden.

Wenn Sie versuchen, ein Segment von Präprozessor Code zu erstellen, die mehrmals aufgerufen werden kann leicht unterschiedliche Dinge zu vollbringen, eine (mäßig schrecklich), wie Sie dies tun können, ist den Code in eine einzige .h Datei zu isolieren, die Sie dann #include mehrmals. Die Idee ist, dass jedes Mal, wenn Sie die Datei #include Sie „calling Ihre Routine“ werden -. Sie zuerst #defineing bestimmte Präprozessorkonstanten „Argumente übergeben“, dass die enthaltene Datei bezieht sich auf

Ein Ort, an dem ich dies nützlich sein gesehen habe, ist „smart“ Aufzählungen bei der Erzeugung, die zu / von ihren „Stringized“ Formen umwandeln kann (die für I / O nützlich sind). Sie erstellen eine .h Datei enthält z.

ENUMVAL(foo)
ENUMVAL(bar)
ENUMVAL(baz)

und dann später #include diese Datei zweimal: einmal, wo ENUMVAL() so definiert ist als eine enum Erklärung zu schaffen, und einmal, als ENUMVAL() so definiert ist, als eine Reihe von Stringized Namen zu erzeugen. Durch es auf diese Weise zu tun, müssen Sie nicht die Liste der tatsächlichen Token mehr als einmal angegeben werden.

#define definer(x) #define #x?

#x ist ein stringification von x. Sie können nicht einen String-Token #define. (#Define "foo"). Es hat eine Kennung sein [a-zA-Z0-9 _] * Token.

Sie nicht Nest # ist so zu definieren. Sie können keine #define in einer #define haben.

Sie können haben #, wenn die innerhalb #if Blöcke.

#ifdef FOO

#ifdef BAR
 ...
#else // BAR
 ...
#endif // BAR

#else // FOO
 ...
#endif //FOO

Sie sind auch etwas eingeschränkt in Bezug auf die Ausdrücke, die Sie in #if Makros verwenden können. Aber manchmal kann man das umgehen. Zum Beispiel:

        /* Use CONCATENATE_4_AGAIN to expand the arguments to CONCATENATE_4 */
#define CONCATENATE_4(      a,b,c,d)  CONCATENATE_4_AGAIN(a,b,c,d)
#define CONCATENATE_4_AGAIN(a,b,c,d)  a ## b ## c ## d

    /* Creates a typedef that's legal/illegal depending on EXPRESSION.       *
     * Note that IDENTIFIER_TEXT is limited to "[a-zA-Z0-9_]*".              *
     * (This may be replaced by static_assert() in future revisions of C++.) */
#define STATIC_ASSERT( EXPRESSION, IDENTIFIER_TEXT)                     \
  typedef char CONCATENATE_4( static_assert____,      IDENTIFIER_TEXT,  \
                              ____failed_at_line____, __LINE__ )        \
            [ (EXPRESSION) ? 1 : -1 ]

Plus so etwas wie:

STATIC_ASSERT( sizeof(int1) == 1, sizeof_int1_equal_1 );

(Ja, ich weiß über #include . Es ist nur ein Beispiel.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top