C++ 是否有GCC预处理器指令来检查代码是否在64位机器上编译?
我试着做如下的事情C++ 是否有GCC预处理器指令来检查代码是否在64位机器上编译?,c++,gcc,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”格式说明符。我正在寻
#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命令行或源代码。我认为u LP64_uuuuuuuu可能就是您想要的。看
不过,也许更好的方法是使用%p说明符来printf(),而不是使用%ld或%d。然后,您甚至不必担心指针的大小。一个推荐的解决方案是使应用程序的行为更加可预测。如果将其设置为依赖于内存指针的大小,则可能会出现一些意外情况。Printf只理解几个类型,如果您必须为一个类型打印一个值,而您不能始终确保它是真正已知的,那么最好将它转换为已知的值
printf("Some message with %ld in the middle of it\n", (long) d);
这是一个很好的建议,适用于任何类型。例如,要打印Unix PID(类型为PID\u t):
只要目标类型足够大,您就不必知道pid的类型和大小。您想使用
inttypes.h
中定义的PRI*
宏。您可以通过定义\uu STDC\\u FORMAT\\u宏来启用它们。然后您可以使用
intptr_t d = ... ;
printf("This is an intptr_t: %" PRIxPTR "\n", d);
如果\uuuWordSize==64
,则PRIxPTR
宏将扩展到llx
,否则lx
或x
。我同意您的一般原理,但请注意,您不应该依赖于适合长字符串的指针。在64位Windows上,它们没有()。对于指针,“%p”是正确的方式(正如弗雷德·拉森所指出的)。+1真的很酷。然而,在我的x86-64 Debian系统上的结果略有不同。“echo | g++-xc++-include limits.h-P-E-”返回64。“echo PRIxPTR | g++-xc++-D|u STDC|u FORMAT|u宏-包括inttypes.h-E-| tail-1”返回“l”“x”。好吧,PRI*-宏是c99,因此如果你能证明它们在你的机器上有错误,你应该向debian人报告一个bug。我的猜测是:“l”“x”是“lx”,如果指针和long
都是64位或都是32位,这是可以的;只有当sizeof(void*)==sizeof(long-long)
但sizeof(long-long)>sizeof(long)
intptr_t d = ... ;
printf("This is an intptr_t: %" PRIxPTR "\n", d);