传递一个结构成员名称以在C中运行?
问题描述:
是否有任何简单的方法将结构成员的名称传递给C中的函数?例如,如果我要做到这一点:传递一个结构成员名称以在C中运行?
(我知道的代码是不正确的,我只是写它来解释这个问题)
struct Test
{
int x;
int y;
};
int main()
{
struct Test t;
t.x = 5;
t.y = 10;
example(t, <MEMBER NAME>);
}
void example(struct Test t, <MEMBER NAME>)
{
printf("%d", t.<MEMBER NAME>);
}
答
不知道这是你正在寻找什么,但这里是使用offsetof
个八九不离十的解决方案:
struct Test
{
int x;
int y;
};
void example(void *base, size_t offset)
{
int *adr;
adr = (int*)((char*)base + offset);
printf("%d\n", *adr);
}
int main(int argc, char **argv)
{
struct Test t;
t.x = 5;
t.y = 10;
example(&t, offsetof(struct Test, y));
}
+2
请注意,只有GCC(和工作编译器)允许您对'void *'进行算术运算。 C标准不允许这样做。你需要这样做:'int * adr =(int *)((char *)base + offset);'符合标准。 IIRC,海湾合作委员会将'如果你用'pedantic'刺激它会大发雷霆。 –
+0
编辑我的答案谢谢@JonathanLeffler。 – duncan
你可以使用成员[偏移](http://man7.org/linux/man-pages/man3/offsetof.3.html),而不是名称。 – user2357112
概念上与http://stackoverflow.com/q/13653024/2564301相同,对吧? – usr2564301
您可以使用宏而不是函数。这对于一个更复杂的函数可能很快就会变得很奇怪,但为了您的需要,您可以执行'#define example(x,member)printf(“%d \ n”,x.member)''。但这意味着你会失去类型安全(以及其他一些事情)。 – neoaggelos