Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有GCC预处理器指令来检查代码是否在64位机器上编译?_C++_Gcc - Fatal编程技术网

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