我见过很多人询问从 32 位到 64 位机器的移植问题。但是将编写在 64 位上的代码移植到 32 位上不是很常见吗?我正在尝试在 C 中将插件从 64 位移植到 32 位,但在将 void * 存储到 64 位整数(反之亦然)的情况下面临类似问题。
更改代码以使相同的代码在两台(i386 和 x86_64)机器上都可以工作的方法应该是什么?我认为在 32 位机器上使用 uint64_t * 代替 32 位的 void* 没有意义?对于这种情况,是否存在一些通用方法?
指针永远不应该存储在固定大小的整数中。如果您需要将指针存储为整数类型,则正确的类型是uintptr_t
,但您根本不应该将指针存储在整数对象中。但是,使用太大的整数类型并没有真正的危害。它只会浪费一点内存。因此,如果存储指针uint64_t
是代码中的唯一问题,它应该可以正常编译为 32 位目标。
如您所知,您可以使用一系列预处理器指令“#define”、“#ifdef”等为 32 位和 64 位架构编写一个源代码。您需要为 32 位和 64 位分别编译一次源代码。这可能是这样的。
test.c 示例代码
#ifdef ARCH_64
typedef UINT unit64_t;
#else
typedef UINT unit32_2;
UINT *my_uint_ptr;
$ gcc -m32 test.c
$ gcc -m64 -DARCH_64 test.c