我想知道解决以下问题的方法。请帮忙。
问题:
struct s{
int a;
int b;
}st;
我想要一个函数在运行时初始化值。问题是我想让它成为通用的,所以我想将成员名称作为输入传递给函数并将其初始化。
fun_init(char* mem, int val)
{
// Find offset of the member variable in struct 'st'
// Assign the value
}
一个直接的解决方案是在成员名称上使用字符串比较。但是如果我以后偶尔添加一些额外的变量,我将不得不修改我不想要的功能。 希望我能够清楚地确定问题。
由于
答案 0 :(得分:2)
C没有提供按名称查找符号的方法。有关详细信息,请参阅this thread。
这里最简单的解决方案是使用associative array。
Read this thread如果你需要混合价值类型。 (在您的示例中,所有值类型都是int,因此您可能不需要它。)
答案 1 :(得分:1)
void fun_init(int *storage, int val) {
*storage = val;
}
void something_else(void) {
struct s {
int a;
int b;
} st;
fun_init(&st.a, 42);
}
但是,如果您需要动态确定密钥名称,那么您做错了。如果您需要存储键/值对,可能是interested in the hashtable。
答案 2 :(得分:0)
我猜你想要从用户输入或持久性初始化struct。
解决方案涉及创建@Domi提到的关联数组。
数组中填充了键/值对,例如(const char *,unsigned)。
键是struct成员的名称,值是从结构的开头的偏移量。
每个结构都需要有一个初始化上面数组的函数。您可以通过offsetof
宏获取成员的偏移量。
这将 NOT 处理具有位字段的结构(子字节命名成员)。