以这段代码为例:
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/