使用变量访问常规结构成员

时间:2012-04-06 11:03:38

标签: c struct

不完全确定我的问题标题描述了我想做什么,但想不出有多好用它来说!我正在使用C,也许下面的伪代码将描述我正在尝试做的事情:

typedef struct obj
{
    char *str1;
    char *str2;
    char *str3;
} object;

/* global variable */
object *glob;

void black_box_function(local, member) ????
{
    /* Do something with glob->member and local->member */
}

void main()
{
    object *ob1, *ob2;

    /* Initialise glob, ob1 and ob2 somewhere */

    black_box_function(ob1, str1);
    black_box_function(ob2, str3);

}

希望您能看到我正在尝试做的事情。我有一个“黑盒子”功能,可以与特定成员做某事,我需要能够告诉黑盒功能使用哪个成员。

我不想直接将该成员传递给该函数,就像在此代码中一样,因为它不能轻易地适应我的其余代码。

black_box_function(ob1->member, glob->member)

3 个答案:

答案 0 :(得分:2)

也许您可以为结构创建访问器函数并将这些访问器作为函数指针参数传递,而不是直接传递成员

typedef struct
{
    int a;
    int b;
} foo;

typedef int* (*accessor)(foo*);

int* get_a(foo* f) { return &f->a; }
int* get_b(foo* f) { return &f->b; }

void black_box_function(foo* object, accessor fn)
{
    int* p = fn(object);
}

int main(void)
{
    foo bar1;
    foo bar2;

    black_box_function(&bar1, get_a);
    black_box_function(&bar2, get_b);

    return 0;
}

答案 1 :(得分:2)

您可以执行以下操作(使用GCC扩展名):

#define black_box(local, member)  black_box_function((local), __builtin_offsetof(object, member))

void black_box_function(object *local, int offset)
{
    char *lmember = ((void *)local) + offset;
    char *gmember = ((void *)global) + offset;
    /* do stuff */
}

但是,您必须事先知道您的会员类型。请记住,C不是动态类型语言,因此根本没有运行时内省。

编辑:您可以实施offsetof()功能而无需借助GCC扩展程序,例如:

#define offsetof(type, field) ((int) (unsigned long) &((type *) 0)->field)

答案 2 :(得分:1)

由于所有都是char *,您可以重新定义结构,如:

typedef struct obj
{
    char **str; // Array of c
} object;

然后,您可以从main中发送str的索引:

black_box_function(obj1, index)

所以你可以像黑盒子里的obj1->str[i]一样。

顺便说一下,black-box_function无法编译。

旁注:黑盒功能和可编辑代码上的更多信息/代码可以更好地了解您的目标。