#ifdef innerhalb von #define

Lesezeit: 6 Minuten

agent.smiths Benutzeravatar
agent.smith

Ich versuche so etwas zu schreiben:

#define COV_ON(x) \
                #ifdef COVERAGE_TOOL \
                    _Pragma (COVERAGE #x)
                #endif

Gibt es eine Möglichkeit zu definieren COV_ON so was? Ich weiß, was ich oben getan habe, ist falsch, da ich es nicht haben kann #ifdef innen #define. (# ist kein zulässiges Zeichen in #define). Also gibt es eine Lösung?

  • Alle Antworten hier scheinen die Verwendung von wegzulassen do {} while(0) (oder Äquivalent), um eine leere Anweisung zu vermeiden; siehe meine Antwort auf dem verlinkten Duplikat

    – Roger Lipscombe

    18. April 2018 um 18:13 Uhr

Nicht möglich. Machen Sie es andersherum:

#ifdef COVERAGE_TOOL
#define COV_ON(x) _Pragma (COVERAGE #x)
#else
#define COV_ON(x)
#endif

Einfach umdrehen:

#ifdef COVERAGE_TOOL
#define COV_ON(x) _Pragma (COVERAGE #x)
#else
#define COV_ON(x) /* foo */
#endif

  • Danke für deine Antwort. Ich habe COV_ON(on) und COV_ON(off) ausprobiert, aber dann erhalte ich eine Fehlermeldung mit der Meldung error:expected ‘)’,near off. Irgendeine Idee zu dem Problem.

    – agent.schmied

    7. April 2011 um 20:31 Uhr


  • es sind Saiten. Muss ich sie als normale Zeichenfolgen in Anführungszeichen verwenden? Wie “an” und “aus”.

    – agent.schmied

    7. April 2011 um 20:47 Uhr

  • Es hängt von Ihrer Definition von COVERAGE ab, aber ich würde vermuten, dass Sie sie zitieren müssen. Ich schlage vor, dass Sie eine weitere Frage für dieses neue Problem öffnen.

    – Philipp

    7. April 2011 um 20:54 Uhr

  • Ich habe es mit Anführungszeichen versucht, aber ohne Erfolg. Ich habe bereits einen neuen Thread eröffnet. Lassen Sie mich wissen, wenn Sie der Meinung sind, dass die Syntax für _Pragma falsch ist.

    – agent.schmied

    7. April 2011 um 21:07 Uhr

Benutzeravatar von Technosaurier
Technosaurier

Dies ist eine alte Frage, aber es brauchte eine aktuelle Antwort.

Anstatt eine Inline-ifdef innerhalb des Makros zu verwenden, können Sie selektiv eine definieren __VA_ARGS__ Makro, um dasselbe zu tun

#ifdef COVERAGE_TOOL
#define IF_COVERAGE_TOOL(...) __VA_ARGS__
#else
#define IF_COVERAGE_TOOL(...)
#endif
#define COV_ON(x) IF_COVERAGE_TOOL( _Pragma (COVERAGE #x) )

Dies hat eine ähnliche Funktionalität wie ein ifdef, außer dass Sie Klammern erhalten, um den Anfang und das Ende abzugrenzen (was bei den meisten IDEs keine Probleme beim Code-Folding gibt). Sie können es trotzdem verwenden #define und #ifdef im Kontext, #include ist nicht erlaubt. Um ähnliche Inline-Fähigkeiten zu erhalten #elsekönnen Sie ein entsprechendes Makro wie folgt definieren:

//#define FOO
#ifdef FOO
#define IF_FOO(...) __VA_ARGS__ 
#define NO_FOO(...)
#else
#define IF_FOO(...)
#define NO_FOO(...) __VA_ARGS__
#endif

IF_FOO(
  #define BAR 5
  int foo = BAR;
)
NO_FOO(
  #define foo 5
)

Nur einer von NO_FOO()/IF_FOO wird Code produzieren.

OK, das ist ein praktischer Hack, aber können wir es schaffen? MEHR nützlich als #ifdefs… Boolesche Logik und Konfiguration vielleicht? Lassen Sie uns einige Wahrheitstabellen (und ein paar Hilfsmakros) einrichten.

#define PASTE_(x,y) x##y
#define PASTE(x,y) PASTE_(x,y)
#define PASTE3_(x,y,z) x##y##z
#define PASTE3(x,y,z) PASTE3_(x,y,z)
#define Y(...) __VA_ARGS__
#define N(...)
#define IF(x) x //alternate method similar to IFNOT()

#define NOT_N Y
#define NOT_Y N
#define IF_NOT(x) PASTE(NOT_,x)
#define NOT(x) PASTE(NOT_,x)

#define N_OR_N N
#define N_OR_Y Y
#define Y_OR_N Y
#define Y_OR_Y Y
#define OR(x,y) PASTE3(x,_OR_,y)

#define N_AND_N N
#define N_AND_Y N
#define Y_AND_N N
#define Y_AND_Y Y
#define AND(x,y) PASTE3(x,_AND_,y)

#define N_XOR_N N
#define N_XOR_Y Y
#define Y_XOR_N Y
#define Y_XOR_Y N
#define XOR(x,y) PASTE3(x,_XOR_,y)

#define N_NOR_N Y
#define N_NOR_Y N
#define Y_NOR_N N
#define Y_NOR_Y N
#define NOR(x,y) PASTE3(x,_NOR_,y)

#define N_NAND_N Y
#define N_NAND_Y Y
#define Y_NAND_N Y
#define Y_NAND_Y N
#define NAND(x,y) PASTE3(x,_NAND_,y)

#define N_XNOR_N Y
#define N_XNOR_Y N
#define Y_XNOR_N N
#define Y_XNOR_Y Y
#define XNOR(x,y) PASTE3(x,_XNOR_,y)

#define IF2(x,y,z) PASTE3(x,y,z)

config.h

#define FOO Y
#define BAR N
#define BAZ Y

code.c

AND(FOO,BAR)(/*do stuff if both FOO and BAR are enabled*/)
IF2(FOO,_AND_,BAR)( /*do stuff if both FOO and BAR are enabled*/ )
OR(BAZ,AND(FOO,BAR))(
  /*do stuff if both FOO and BAR are enabled or BAZ is enabled*/
)

  • Ich mag deinen Stil (=

    – étale-Kohomologie

    12. Juli 2018 um 6:34 Uhr


#ifdef COVERAGE_TOOL
    #define COV_ON(x) _Pragma (COVERAGE #x)
#else
    #define COV_ON(x)
#endif

Sie können nicht. Aber man kann tauschen #ifdef und #define:

#ifdef COVERAGE_TOOL
#   define COV_ON(x) _Pragma (COVERAGE #x)
#else
#   define COV_ON(x)
#endif

  • Danke für deine Antwort. Ich habe COV_ON(on) und COV_ON(off) ausprobiert, aber dann erhalte ich eine Fehlermeldung mit der Meldung error:expected ‘)’,near off. Irgendeine Idee zu dem Problem.

    – agent.schmied

    7. April 2011 um 20:40 Uhr

  • Ohne Ihren Compiler zu kennen, müssten wir wissen, was er erwartet _Pragma Syntax ist; Wie würdest du das ohne Makro machen?

    – sam hocevar

    7. April 2011 um 20:55 Uhr


  • Ich verwende den VC2005-Compiler und habe die _Pragma-Syntax online gesehen. Ich habe #pragma noch nie auf diese Weise verwendet.

    – agent.schmied

    7. April 2011 um 21:06 Uhr

  • Dann brauchen Sie einen Stringify-Hack. Siehe diese Frage und Antwort.

    – sam hocevar

    7. April 2011 um 21:10 Uhr


  • Ich denke, das Problem ist VC2005. Sie verwenden nicht _Pragma, sondern __pragma. Ich bin mir nicht sicher, aber es sieht so aus. Aber ich bekomme immer noch eine Warnung unbekanntes Pragma mit __pragma.

    – agent.schmied

    7. April 2011 um 21:28 Uhr


Benutzeravatar von jberg
jberg

Wie Sie bereits erwähnt haben, ist es nicht möglich, ein #ifdef in einem #define zu haben. Was Sie stattdessen tun sollten, ist die Reihenfolge umzukehren:

#ifdef COVERAGE_TOOL \
  #define COV_ON(x) \
    etc.
#endif

  • Danke für deine Antwort. Ich habe COV_ON(on) und COV_ON(off) ausprobiert, aber dann erhalte ich eine Fehlermeldung mit der Meldung error:expected ‘)’,near off. Irgendeine Idee zu dem Problem.

    – agent.schmied

    7. April 2011 um 20:40 Uhr

  • Ohne Ihren Compiler zu kennen, müssten wir wissen, was er erwartet _Pragma Syntax ist; Wie würdest du das ohne Makro machen?

    – sam hocevar

    7. April 2011 um 20:55 Uhr


  • Ich verwende den VC2005-Compiler und habe die _Pragma-Syntax online gesehen. Ich habe #pragma noch nie auf diese Weise verwendet.

    – agent.schmied

    7. April 2011 um 21:06 Uhr

  • Dann brauchen Sie einen Stringify-Hack. Siehe diese Frage und Antwort.

    – sam hocevar

    7. April 2011 um 21:10 Uhr


  • Ich denke, das Problem ist VC2005. Sie verwenden nicht _Pragma, sondern __pragma. Ich bin mir nicht sicher, aber es sieht so aus. Aber ich bekomme immer noch eine Warnung unbekanntes Pragma mit __pragma.

    – agent.schmied

    7. April 2011 um 21:28 Uhr


1420630cookie-check#ifdef innerhalb von #define

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

Privacy policy