如何在我的程序中设置一个依赖于平台的常量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在我的程序中设置一个依赖于平台的常量相关的知识,希望对你有一定的参考价值。

我们正在编写一个自动分配和释放内存的程序,换句话说就是垃圾收集器。它应该在64位机器和32位机器上工作,而不必进入并更改代码。这意味着我们的按位函数不能有例如x << 63,因为这会在32位机器中崩溃。所以我们需要的是一个在编译程序时设置的常量,它应该是指针的长度或uintptr_t,它将是4字节或8字节长,具体取决于平台并使用它们作为起点。

我希望我的问题很清楚,制定它并不容易。

答案

您可以使用sizeof来执行此操作。例如。:

#include <stdio.h>
#include <stdint.h>

static const size_t ptr_size = sizeof(int*);
static const size_t ptr2_size = sizeof(uintptr_t);

int main() {

    printf("int*: %zu\n", ptr_size);
    printf("uintptr_t: %zu\n", ptr2_size);

    return 0;
}

这将在64位平台上提供以下内容:

int*: 8
uintptr_t: 8
另一答案

您可能想要使用<stdint.h>(及其intptr_t)和<limits.h>。两者均由C11标准规定(参见n1570)。您可以使用INTPTR_MAX(和/或INTPTR_WIDTH,后者特定于某些实现,如GCC),它们是预处理器常量。

你可以使用一些build automation技巧在构建时自动检测(例如使用autoconf),如果你有一个64位或32位系统(所以用预处理器标志生成一些东西),这很常见。你也可以使用feature_test_macros(7)

我们正在写一个垃圾收集器

编写高效的GC可能很困难并且非常耗时(并且通常需要一些编译器和操作系统特定的代码)。您是否考虑过将某些现有的库用于GC,例如Boehm GCMPS

另一答案

您是否尝试过预处理器指令?因此:

#ifdef SYSTEM_32_BITS
   int * myPtr = 0x00;
#elseif SYSTEM_64_BITS
   long myVal = 0;
#endif

您可以定义一个系统,另一个参数不会编译。这会对你有用吗?

以上是关于如何在我的程序中设置一个依赖于平台的常量的主要内容,如果未能解决你的问题,请参考以下文章