以这段代码为例:

typedef struct {
    int value;
    char another;
} foo;

typedef struct {
    float yet_another;
    long really_another;
} bar;

typedef struct {
    char* name;
    void* data;
} gen;

int main(int argc, char** argv) {
    gen foo_gen, bar_gen;

    foo_gen.name = "Foo";
    foo_gen.data = (foo*) malloc(sizeof(foo));

    bar_gen.name = "Bar";
    bar_gen.data = (bar*) malloc(sizeof(bar));

    ((foo*) foo_gen->data)->value = 0;
    ((bar*) bar_gen->data)->yet_another = 1.0f;

    return 0;
}

这段代码可以正常工作,因此我定义了2个宏以方便我的工作:
#define FOO_DATA(N, D) ((foo*) N->data)->D
#define BAR_DATA(N, D) ((bar*) N->data)->D

但似乎太重复了。我希望它更通用,使宏知道它应该转换哪种类型。我试过使用__auto_type
#define DATA(N, D) (__auto_type N->data)->D

但没用。似乎typeof也不适用于宏。我该怎么做?

最佳答案

如果我和其他评论者理解正确,您希望能够这样做:

struct a {
    int field1;
} a;

struct b {
    int field2;
} b;

void *self1 = &a;
void *self2 = &b;

int f1 = MAGIC(self1)->field1;
int f2 = MAGIC(self2)->field2;

关于MAGIC的一些定义。
这在C语言中是不可能的。

关于c - 知道void *分配类型的宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42238834/

10-13 07:58
查看更多