Ist es möglich, einen Präprozessor Variable in C zu drucken?
-
05-07-2019 - |
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
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“.