在C语言中将结构体成员名称传递给函数?

4
有没有一种简单的方法在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>);
}

2
你可以使用成员offset,但不能使用名称。 - user2357112
1
从概念上讲,与http://stackoverflow.com/q/13653024/2564301相同,对吗? - Jongware
你可以使用宏代替函数。对于更复杂的函数,这可能会很快变得奇怪,但对于你的需求,你可以使用 #define example(x, member) printf("%d\n", x.member)。但这意味着你失去了类型安全性(和其他一些东西)。 - neoaggelos
这是更现代的语言(如C#,Java,JavaScript等)的一个特性,通常称为“反射”。 C语言没有这个功能。您可以使用各种偏移量计算技巧。 - pm100
1个回答

6

不确定这是否正是您要寻找的,但是以下是使用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);以符合标准。 如果您使用-pedantic选项,则GCC会给出警告。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接