Is it possible to print a preprocessor variable in C?

CVariablesC Preprocessor

C Problem Overview


Is is possible to print to stderr the value of a preprocessor variable in C? For example, what I have right now is:

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

But what I'd like to do is:

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

Is something like this possible in C?

C Solutions


Solution 1 - C

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 - C

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 - C

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 - C

Use the preprocessor token-pasting operator: ##TOKEN_NAME

As previously noted, the preprocessor directives you are using are non-standard, so YMMV.

Solution 5 - C

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".

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionapalopohapaView Question on Stackoverflow
Solution 1 - CMattMView Answer on Stackoverflow
Solution 2 - CMarc AbramowitzView Answer on Stackoverflow
Solution 3 - CJonathan LefflerView Answer on Stackoverflow
Solution 4 - CrtenhoveView Answer on Stackoverflow
Solution 5 - CMichael Aaron SafyanView Answer on Stackoverflow