gpt4 book ai didi

c - 如何在 32 位和 64 位机器的头文件中获得相同的结构?

转载 作者:太空宇宙 更新时间:2023-11-04 04:55:18 25 4
gpt4 key购买 nike

对于 32 位和 64 位机器,我有一个结构应该具有相同的形状(至少相同的大小,我认为偏移量会随之而来)。

我们的结构是一个混淆类型,大小是在构建时生成的,我们不知道这个类型是否会在 32 或 64 位架构上使用。

这样做的最佳做法是什么?你有项目这样做的指示吗?

最佳答案

如果我理解正确的话,您想生成一个结构,该结构在 32 位系统和 64 位系统上的布局应该完全相同。

例如假设你会生成这个结构:

struct S
{
long l;
char *s;
int i;
long l2;
};

然后这将在 64 位和 32 位上具有不同的布局(在这种情况下,字符指针将具有不同的大小)。如果您在旧的 DOS 系统上编译它,那么 int 将是 16 位而不是 32 位,您将再次拥有不同的布局。

解决这个问题的最佳方法是定义您自己的类型,并在您的结构中使用它们,如下所示:

typedef long  MY_INT4;
typedef short MY_INT2;

然后在您的结构中使用这些类型。如果您需要移植到不同的系统,您只需要检查您的 typedef。

struct S
{
MY_INT4 m1;
MY_INT2 m2;
};

对于某些类型(如指针),这个技巧不起作用,因为没有用于 32 位或 64 位指针的内置类型,所有指针都是相似的(如果我们远远忘记旧的 DOS - 和近指针)。

对于那些类型,您可以使用宏。例如。这个:

struct S
{
MY_INT4 m1;
MY_INT2 m2;
MY_POINTER(char,m3);
};

然后对于 64 位系统你只需要像这样定义 MY_POINTER:

#define MY_POINTER(t,m) t *m

对于 32 位系统,您可以这样定义它:

#define MY_POINTER(t,m) t *m; t *dummy

因此对于 32 位系统,我们添加 2 个指针字段而不是 1 个。

最后一种方法的问题是,当您有 2 个指针时,这些宏将生成 2 个同名成员。

您可以使用未命名 union 来解决此问题。像这样定义你的宏:

#define MY_POINTER(t,m) t *m; union {t *dummy;}

请注意,在这个解决方案中,我忽略了字节顺序问题。如果你想解决这个问题,你需要更深入地研究。

关于c - 如何在 32 位和 64 位机器的头文件中获得相同的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9394727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com