Is there a GCC preprocessor directive to check if

2019-01-11 18:19发布

问题:

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.

回答1:

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.



回答2:

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.



回答3:

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.



标签: c++ gcc