Frage

Ist es möglich, den Wert eines Präprozessor Variable in C in stderr zu drucken? Zum Beispiel, was ich jetzt habe, ist:

#define PP_VAR (10)
#if (PP_VAR > 10)
    #warning PP_VAR is greater than 10
#endif

Aber was ich tun möchte ist:

#define PP_VAR (10)
#if (PP_VAR > 10)
    #warning PP_VAR=%PP_VAR%
#endif

Ist so etwas möglich in C

War es hilfreich?

Lösung

Sie können den Wert einer Präprozessor Variable unter Visual Studio ausdrucken. Die folgenden druckt den Wert von _MSC_VER:

#define STRING2(x) #x
#define STRING(x) STRING2(x)

#pragma message(STRING(_MSC_VER))

Nicht sicher, wie Standard dies allerdings ist.

Andere Tipps

Dies funktioniert mit GCC 4.4.3:

#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)

ergibt:

src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017

Viele C-Compiler-Unterstützung #warning (aber es ist nicht von der C-Standard definiert ist).

jedoch GCC zumindest nicht Vorverarbeitung auf den Daten macht, die folgt, was bedeutet, dass es schwierig ist, den Wert einer Variablen zu sehen.

#define PP_VAR 123
#warning "Value of PP_VAR = " PP_VAR
#warning "Value of PP_VAR = " #PP_VAR
#warning "Value of PP_VAR = " ##PP_VAR

GCC erzeugt:

x.c:2:2: warning: #warning "Value of PP_VAR = " PP_VAR
x.c:3:2: warning: #warning "Value of PP_VAR = " #PP_VAR
x.c:4:2: warning: #warning "Value of PP_VAR = " ##PP_VAR

Mit dem Präprozessor-Token-Einfügen Operator: ## TOKEN_NAME

Wie bereits erwähnt, sind die Präprozessordirektiven Sie verwenden sind Nicht-Standard, so YMMV.

Nun, was Sie tun, ist eigentlich nicht-Standard. Zum einen ist die „#WARNING“ oder „#warn“ Richtlinie nicht Standard. Zweitens, wenn der Prä-Prozessor verwendet wird, die Zeile mit dem Rautenzeichen beginnen müssen, ohne Leerzeichen:

#ifdef BLAH1
#    define BLAH2 // OK, because pound is at the very left.
#endif

#ifdef BLAH3
     #define BLAH4 // Works on many compilers, but is non-standard.
#endif

Da Sie bereits eine Nicht-Standard-Erweiterung verwenden, müssen Sie die Dokumentation des jeweiligen Prä-Prozessor / Compiler, die Sie verwenden sehen, um zu sehen, was es sagt über „#WARNING“.

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