C中结构成员的运行时初始化(运行时决定的成员名)

时间:2013-11-28 06:14:06

标签: c data-structures

我想知道解决以下问题的方法。请帮忙。

问题:

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
}

一个直接的解决方案是在成员名称上使用字符串比较。但是如果我以后偶尔添加一些额外的变量,我将不得不修改我不想要的功能。 希望我能够清楚地确定问题。

由于

3 个答案:

答案 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 处理具有位字段的结构(子字节命名成员)。