是否有GCC预处理器指令来检查代码是否在64位机器上编译?

时间:2009-03-25 18:44:45

标签: c++ gcc

我正在尝试做以下事情;

#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);

'intptr_t'类型的变量'd'在32位机器上需要'%d'格式说明符,在64位机器上需要格式说明符'%ld'。我正在寻找一种解决方案,能够在32位机器和64位机器上编译代码,而无需更改GCC命令行或源代码。

3 个答案:

答案 0 :(得分:24)

我认为__LP64__可能就是你要找的东西。见http://gcc.gnu.org/onlinedocs/gcc-4.1.2/cpp/Common-Predefined-Macros.html

但是,更好的方法是使用%p说明符来printf()而不是%ld或%d。然后你甚至不必担心你的指针大小。

答案 1 :(得分:8)

您想使用PRI*中定义的inttypes.h宏。您可以通过定义__STDC\_FORMAT\_MACROS来启用它们。然后你可以使用

 intptr_t d = ... ;
 printf("This is an intptr_t: %" PRIxPTR "\n", d);

如果PRIxPTR,则llx宏将扩展为__WORDSIZE == 64,否则会扩展为lxx

答案 2 :(得分:1)

推荐的解决方案是让您的应用程序表现得更具可预测性。如果你使它依赖于内存指针的大小,你可能会有一些不愉快的意外。 Printf只能理解几种类型,如果你必须打印一个你不能总是确保知道它的类型的值,那么把它转换成已知的东西要好得多。

printf("Some message with %ld in the middle of it\n", (long) d);

这是一个很好的建议,适用于任何类型。例如,要打印Unix PID(类型为pid_t):

pid_t pid = fork();
printf("Fork returned %d.\n", (int) pid);

只要目标类型足够大,您就不必知道pid的类型和大小。