如何确定指针大小的预处理器C

时间:2018-07-31 14:40:12

标签: c pointers

我正在开发OpenGL的软件实现,并且OpenGL似乎要求我返回32位指针。为了节省时间,我将其放入64位系统的C语言map中,以便从32位伪地址中检索64位指针。但是,在32位系统上,这会造成麻烦,因此我应该使用逐字指针。

这基本上是我想要在共享标头中执行的操作:

#if <64-bit>
    #include <search.h>
    extern void * pointerTable;
    typedef struct {
          int key;
          void* value;
    } intPtrMap;

    inline int compar(const void *l, const void *r) {
        const intPtrMap *lm = l;
        const intPtrMap *lr = r;
        return lm->key - lr->key;
    }

    inline uint32_t allocate(size) {
        void* result = malloc(size);
        intPtrMap *a = malloc(sizeof(intStrMap));
        a->key = (uint32_t) result;
        a->value = result;
        tsearch(a, &pointerTable, compar);
        return (uint32_t) result;
    }

    inline int getPtr(ptr) {
        intPtrMap *find_a = malloc(sizeof(intPtrMap));
        find_a->key = ptr;
        void *r = tfind(find_a, &root, compar);
        return (*(intPtrMap**)r)->value;
    }
#else
    inline uint32_t allocate(size) {
        return (uint32_t) malloc(size);
    }

    inline uint32_t getPtr(ptr) {
        return (uint32_t) ptr;
    }
#endif

关于第一个条件的任何建议?

2 个答案:

答案 0 :(得分:3)

  

如何确定指针大小的预处理器C(?)

以便携式方式确定指针大小很难。

各种指针大小

通常没有比对象或void*的指针更宽的函数指针。
int charstruct的指针大小可以不同,尽管这种情况很少见。
因此,让我们减少确定void *指针大小的任务。

预处理器数学

PP数学是有限的,因此代码需要小心。让我们继续使用整数数学。

(u)intptr_t

非常常用的可选类型(u)intptr_t在这里很有用。它们允许将void *转换为整数,然后转换为等效的void*

尽管整数类型可能比指针类型宽,但我断言这种情况很少见,并且可以通过C11中的_Static_assert进行检测。


以下内容将处理许多C11平台。通用解决方案的有用想法。

#include <stdint.h>

// C11
_Static_assert(sizeof (void*) == sizeof (uintptr_t), 
    "TBD code needed to determine pointer size");

// C99 or later
#if UINTPTR_MAX == 0xFFFF
  #define PTR16
#elif UINTPTR_MAX == 0xFFFFFFFF
  #define PTR32
#elif UINTPTR_MAX == 0xFFFFFFFFFFFFFFFFu
  #define PTR64
#else
  #error TBD pointer size
#endif

答案 1 :(得分:0)

使用有关StackOverflow的其他问题以及Discord上某人的解决方案,我将以下解决方案拼凑在一起:

#if _WIN32 || _WIN64
    #if _WIN64
        #define PTR64
    #else
        #define PTR32
    #endif
#elif __GNUC__
    #if __x86_64__ || __ppc64__
        #define PTR64
    #else
        #define PTR32
    #endif
#elif UINTPTR_MAX > UINT_MAX
    #define PTR64
#else
    #define PTR32
#endif

这应该能够可靠地确定预处理器中64位或32位指针的使用情况。