在C中,我定义了以下struct
:
typedef struct my_struct{
int foo;
my_struct* a;
my_struct* b;
} my_struct;
现在,我有一个变量char my_var;
,它包含值" a"或" b"。
问题:如何访问" my_struct->my_var
"其中my_var
被视为其实际值(即,作为字符a
或b
),而不是"字符串" my_var
?
(实际上,我的编译器抛出一个错误,表示没有成员" my_var
"在结构my_struct
中定义。)
答案 0 :(得分:4)
没有任何内置功能可以做到这一点。 C没有结构类型的运行时内省;成员名称仅在编译时存在。
您可以使用条件运算符:
my_struct *x = my_var == 'a' ? my_struct->a : my_struct->b;
如果实际结构更复杂(您在问题中仅使用2个成员作为简化示例),则可以使用查找表:
struct offset_map {
char name;
size_t offset;
}[] = {
{'a', offsetof(my_struct, a)},
{'b', offsetof(my_struct, b)}
};
然后,您可以编写一个循环遍历表的函数,并返回相应的偏移量。
size_t get_offset(char name) {
int size = sizeof(offset_map)/sizeof(*offset_map);
for (int i = 0; i < size; i++) {
if (offset_map[i].name == name) {
return offset_map[i].offset;
}
}
return 0;
}
my_struct *x = (my_struct *)((char *)&my_struct + get_offset(my_var));
答案 1 :(得分:3)
让我指出,对于索引,我们通常使用数组;-)。 IIUC,您的用例意味着您希望能够通过角色选择的所有成员必须属于同一类型,此处为my_struct *
。所以定义一个数组:
struct my_struct{
int foo;
my_struct* ptrs[255]; /* can index with any char */
};
现在,您可以愉快地使用字符编制索引:
struct my_struct *sP;
/* initialize sP and *sP... */
struct my_struct *sMemP = sP->ptrs['a'];
答案 2 :(得分:1)
您无法将char
变量转换为代码。
您需要检查my_var
的值:
if (my_var == 'a')
my_struct->a;
else if (my_var == 'b')
my_struct->b;
else
; // Handle unexpected value?