2016-10-03 57 views
4

是否有任何简单的方法将结构成员的名称传递给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>); 
} 
+2

你可以使用成员[偏移](http://man7.org/linux/man-pages/man3/offsetof.3.html),而不是名称。 – user2357112

+1

概念上与http://stackoverflow.com/q/13653024/2564301相同,对吧? – usr2564301

+0

您可以使用宏而不是函数。这对于一个更复杂的函数可能很快就会变得很奇怪,但为了您的需要,您可以执行'#define example(x,member)printf(“%d \ n”,x.member)''。但这意味着你会失去类型安全(以及其他一些事情)。 – neoaggelos

回答

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);'符合标准。 IIRC,海湾合作委员会将'如果你用'pedantic'刺激它会大发雷霆。 –

+0

编辑我的答案谢谢@JonathanLeffler。 – duncan