我正在尝试理解匿名联合在我的使用案例中的作用。这个使用案例是为了能够在函数指针表中使用给定方法的不同原型。例如,在以下代码片段中,myfunc可以有两个变体:一个只接受字符串,另一个可以接受额外的参数。
以下是我的代码片段 -
typedef struct my_struct
{
union{
int (*myfunc)(char*);
int (*myfuncEx)(char*, int);
};
}my_struct_t;
int myfunc_imp(char* x)
{
printf("This is myfunc_imp - %s\n", x);
}
int myfuncEx_imp(char* x, int y)
{
printf("This is myfuncEx_imp - %s\n", x);
printf("This is myfuncEx_imp - %d\n", y);
}
int main()
{
char *string = "Hello World";
my_struct_t me1, me2;
me1.myfunc = myfunc_imp;
me1.myfunc(string);
me2.myfuncEx = myfuncEx_imp;
me2.myfuncEx(string, 7);
static const me3 = {myfuncEx_imp};
me3.myfuncEx(string, 8);
return 0;
}
例子me1和me2似乎提供了正确的结果。 但是在例子me3中,我试图在结构体内静态初始化联合时,会抛出以下错误 -
warning: initialization makes integer from pointer without a cast
error: request for member `myfuncEx' in something not a structure or union
有人能指出在结构体中初始化匿名联合的正确方法吗?
编辑:我以一种非常明显错误的方式声明了结构体,正确的方式是-
static const my_struct_t me3 = {myfuncEx_imp};
union
或struct
。但是有匿名的结构体或联合成员。也就是说,“匿名”属性属于周围的struct
/union
,而不是匿名的struct
union
。因此,在理论上,也可以有一个匿名的int
成员。(只是一个思想实验,标准不允许这样做,因为你无法引用它) - too honest for this site