I am trying to do something like the following;
#ifdef 64-bit
#define DECIMAL_FORMAT %ld
#else
#define DECIMAL_FORMAT %d
#endif
.
intptr_t d;
.
printf(“Some message with DECIMAL_FORMAT in the middle of it\n”, d);
The variable 'd' being of the type 'intptr_t' needs '%d' format specifier on 32 bit machines and format specifier '%ld' on 64 bit machines. I am looking a solution to be able to compile the code on both 32 bit machines and 64 bit machines without making changes to the GCC command line or the source code.
I think __LP64__ might be what you're looking for. See http://gcc.gnu.org/onlinedocs/gcc-4.1.2/cpp/Common-Predefined-Macros.html
Maybe a better way to go, though, is to use the %p specifier to printf() instead of %ld or %d. Then you don't even have to worry what your pointer size is.
You want to use the PRI*
macros defined in inttypes.h
. You enable them by defining __STDC\_FORMAT\_MACROS
. You can then use
intptr_t d = ... ;
printf("This is an intptr_t: %" PRIxPTR "\n", d);
The PRIxPTR
macro will expand to llx
if __WORDSIZE == 64
, and lx
or x
otherwise.
A recommended solution is to make your application behave more predictably. If you make it dependent on the size of a memory pointer, you may have some undesirable surprises. Printf only understands a few types, if you must print a value for a type that you can't always ensure that it is really known, it is much better to convert it to something known.
printf("Some message with %ld in the middle of it\n", (long) d);
This is a good advice, and valid for any type. For example, to print a Unix PID (that is of type pid_t):
pid_t pid = fork();
printf("Fork returned %d.\n", (int) pid);
You don't have to know what is the type and size of pid, as long as the target type is large enough.