GCC - 在特定偏移中定义成员的结构

t_z*_*t_z 8 c c++ gcc

在gcc中是否有一种方法,我可以在特定偏移量中定义具有特定成员的结构?

我想以下列方式定义一个结构:

struct {
.offset(0xDC) //or something equivalent
   int bar;
} foo;
Run Code Online (Sandbox Code Playgroud)

然后是以下声明:

int a = foo.bar
Run Code Online (Sandbox Code Playgroud)

将与声明相同:

int a = *(int*)((char*)&foo + 0xDC);
Run Code Online (Sandbox Code Playgroud)

*更新*

一些背景:我想访问导出结构中的成员,我没有正确的定义,它有许多成员 - 我只关心其中的少数几个,并且它们的偏移量(结构原始定义)在每个目标上有点不同平台(我需要为几个不同的平台编译我的代码)

我已经考虑过这里的评论中提到的填充选项,但是每次我想添加一个成员时,它都要求我做一些讨厌的计算.例如:

strcut {
.offset(0xDC)
    int bar;
.offset(0xF4)
    int moo;
}foo;
Run Code Online (Sandbox Code Playgroud)

然后更简单:

struct __attribute__ ((__packed__)) struct {
   char pad1[0xD8];
   int bar;
   char pad2[0x18];
   int moo;
}foo;
Run Code Online (Sandbox Code Playgroud)

并且没有考虑到sizeof(int)可以从平台变为平台的事实

INS*_*INS 9

你应该看看__attribute__ ((__packed__)).

在你的情况下你会写:

struct __attribute__ ((__packed__)) {
   char unused[0xDC];
   int bar;
} foo;
Run Code Online (Sandbox Code Playgroud)

如果你能解释你想要做什么,可能还有其他的,可能更优雅的解决方案.


Jes*_*mos 2

您始终可以用字节填充它,并确保告诉 gcc 不要对齐您的结构(因为这可能会消除偏移量)。在这种情况下,您将需要像char pad_bytes[num_pad_bytes];. 虽然真的有理由这样做吗?您始终可以通过执行一些指针算术来计算结构成员的偏移量。注意:您可能希望使用uint8_t类型来填充而不是 char,因为某些编译器实际上可能会将 char(通常是字节)填充到单词的大小。

计算偏移量非常简单

size_t offset = (size_t)&((struct_type *)0)->member);
Run Code Online (Sandbox Code Playgroud)

所有这一切只是简单地返回一个指针,指向成员在 struct_type 中的位置(如果该结构位于内存中的 0x00(它永远不可能)),但由于我们使用 0 作为基数,因此偏移量只是 & 运算符返回的引用。