Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I show the value of a #define at compile time in gcc

Tags:

So far I've got as far as:

#define ADEFINE "23" #pragma message ("ADEFINE" ADEFINE) 

Which works, but what if ADEFINE isn't a string?

#define ADEFINE 23 #pragma message ("ADEFINE" ADEFINE) 

causes:

warning: malformed ‘#pragma message’, ignored

Ideally I'd like to be able to deal with any value, including undefined.

like image 299
John Lawrence Aspden Avatar asked Mar 14 '12 00:03

John Lawrence Aspden


2 Answers

To display macros which aren't strings, stringify the macro:

#define STRINGIFY(s) XSTRINGIFY(s) #define XSTRINGIFY(s) #s  #define ADEFINE 23 #pragma message ("ADEFINE=" STRINGIFY(ADEFINE)) 

If you have/want boost, you can use boost stringize to do it for you:

#include <boost/preprocessor/stringize.hpp> #define ADEFINE 23 #pragma message ("ADEFINE=" BOOST_PP_STRINGIZE(ADEFINE)) 
like image 181
rob05c Avatar answered Oct 16 '22 18:10

rob05c


I'm not sure if this will do what you want, but if you're only interested in this to debug the occasional macro problem (so it's not something you need displayed in a message for each compile), the following might work for you. Use gcc's -E -dD option to dump #define directives along with preprocessing output. Then pipe that through grep to see only the lines you want:

// test.c #include <stdlib.h> #include <stdio.h> #define ADEFINE "23" #include <string.h>  int main(int argc, char *argv[]) { #undef ADEFINE #define ADEFINE 42     return 0; } 

The command gcc -E -dD -c test.c | grep ADEFINE shows:

#define ADEFINE "23" #undef ADEFINE #define ADEFINE 42 
like image 29
Michael Burr Avatar answered Oct 16 '22 20:10

Michael Burr