【问题标题】:Is there a GCC preprocessor directive to check if the code is being compiled on a 64 bit machine?是否有 GCC 预处理器指令来检查代码是否在 64 位机器上编译?
【发布时间】:2009-03-25 18:44:44
【问题描述】:

我正在尝试执行以下操作;

#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”。我正在寻找一种能够在不更改 GCC 命令行或源代码的情况下在 32 位机器和 64 位机器上编译代码的解决方案。

【问题讨论】:

    标签: c++ gcc


    【解决方案1】:

    我认为 __LP64__ 可能是您正在寻找的。见http://gcc.gnu.org/onlinedocs/gcc-4.1.2/cpp/Common-Predefined-Macros.html

    不过,也许更好的方法是使用 %p 说明符来 printf() 而不是 %ld 或 %d。那么你甚至不必担心你的指针大小是多少。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • +1 真的很酷。但是,在我的 x86-64 Debian 系统上的结果略有不同。 “echo __WORDSIZE | g++ -xc++ -include limits.h -P -E -” 返回 64。 “echo PRIxPTR | g++ -xc++ -D__STDC_FORMAT_MACROS -include inttypes.h -E - | tail -1” 返回“l” “x” .
      • 好吧,PRI* 宏是 c99,所以如果你能证明它们在你的机器上行为不端,你应该向 debian 人报告一个错误。
      • 我的猜测如下:“l”“x”是“lx”,如果指针和long都是64位或都是32位,这很好;只有在sizeof(void*) == sizeof(long long)sizeof(long long) > sizeof(long) 时才真正需要“llx”来打印指针
      【解决方案3】:

      推荐的解决方案是让您的应用程序的行为更具可预测性。如果你让它依赖于内存指针的大小,你可能会遇到一些意想不到的意外。 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的类型和大小,只要目标类型足够大即可。

      【讨论】:

      • 我同意你的一般理念,但请注意,你不应该依赖于适合 long 的指针。在 64 位 Windows 上,它们不会 (msdn.microsoft.com/en-us/library/s3f49ktz(VS.71).aspx)。对于指针,“%p”是正确的方式(正如 Fred Larsen 指出的那样)。
      猜你喜欢
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多