动态识别结构成员

时间:2018-06-09 12:35:15

标签: c

有没有可能的方法在运行时检查结构成员?

例如,请考虑以下代码,

#include <stdio.h>

struct example{
    int value;
    char name[32];
    int score;
};

int main()
{
    char in[256]={};

    printf("enter member name :\n");
    scanf("%s",in);

    if(check_member(in) == 1) {
        printf("struct example has member %s \n,in);
        return 0;
    }
    printf("struct example has no member named %s \n,in);
    return -1;
}

如果我输入value到这个程序,它应该打印

  

struct example具有成员值

当我向此程序输入test时,它应该打印

  

struct example没有名为test

的成员

有没有办法编写函数check_member()

2 个答案:

答案 0 :(得分:2)

这是不可能的,因为在编译之后,变量的名称不会仅仅保存在堆栈的内存中,因此无法在运行时获取数据。 当然,@ Yunnosch说你可以用字符串保存成员的名字然后使用strcmp。

答案 1 :(得分:1)

这可能有很多重复的答案。如果我必须这样做,我会采用以下两种方式之一:

  1. 我会建立自己的结构成员名称,他们的偏移量,或许他们的类型的小词典。我会使用标准offsetof()宏来操纵偏移量。维护字典会很麻烦(特别是如果从结构中添加或删除成员可能很频繁),但是不可避免。我会抵制使用预处理器技巧来“缓解”结构和字典定义的维护的诱惑,因为从长远来看,这些往往会更加混乱。

  2. 我根本不会使用C struct,但会实现我自己的关联数组(可能使用哈希表)。

  3. 哦,等一下:

    1. 我会使用SWIG等接口定义语言从单个更高级别的数据描述中自动生成我的struct声明和运行时字典定义。