Is it possible to print a preprocessor variable in C?
Solution 1:
You can print out the value of a preprocessor variable under visual studio. The following prints out the value of _MSC_VER:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message(STRING(_MSC_VER))
Not sure how standard this is though.
Solution 2:
This works with GCC 4.4.3:
#define STRING2(x) #x
#define STRING(x) STRING2(x)
#pragma message "LIBMEMCACHED_VERSION_HEX = " STRING(LIBMEMCACHED_VERSION_HEX)
yields:
src/_pylibmcmodule.c:1843: note: #pragma message: LIBMEMCACHED_VERSION_HEX = 0x01000017
Solution 3:
Many C compilers support #warning
(but it is not defined by the C standard).
However, GCC at least does not do pre-processing on the data that follows, which means it is hard to see the value of a variable.
#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 produces:
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
Solution 4:
Use the preprocessor token-pasting operator: ##TOKEN_NAME
As previously noted, the preprocessor directives you are using are non-standard, so YMMV.
Solution 5:
Well, what you are doing is actually non-standard. Firstly, the "#warning" or "#warn" directive is not standard. Secondly, when using the preprocessor, the line must begin with the pound symbol, without any spaces:
#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
Since you are already using a non-standard extension, you will need to look up the documentation of the particular preprocessor/compiler that you are using to see what it says about "#warning".