C语言中的匿名联合体

4

我正在尝试理解匿名联合在我的使用案例中的作用。这个使用案例是为了能够在函数指针表中使用给定方法的不同原型。例如,在以下代码片段中,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};

6
尝试使用“static const my_struct_t me3 = {myfuncEx_imp};”。 - owacoder
1
哇,谢谢,那是我犯的纯愚蠢错误。谢谢你啊。 - Steve H
没有匿名的unionstruct。但是有匿名的结构体或联合成员。也就是说,“匿名”属性属于周围的struct/union,而不是匿名的struct union。因此,在理论上,也可以有一个匿名的int成员。(只是一个思想实验,标准不允许这样做,因为你无法引用它) - too honest for this site
@Olaf,实际上,至少在形式上,存在“匿名结构”和“匿名联合体”。C2011 6.7.2.1/13定义了这些术语,并且标准在多个地方使用它们。实际上,这是唯一明智的方法,否则很难谈论或描述此类声明的约束和语义,特别是当它们嵌套时。 - John Bollinger
@Olaf,是的,匿名结构必须是其他结构或联合体的成员,因此将它们称为“匿名结构[或联合体]成员”以强调它们的上下文是合理的。但这也会削弱它们自身的类型——它们不仅是成员,而且确实是结构。当然,对于大多数目的来说,这是无关紧要的,因为它们匿名的后果是您永远无法将它们作为整个对象引用。 - John Bollinger
显示剩余3条评论
1个回答

2

我昨天遇到了这个问题。如果不同时指定union成员,那么就不能初始化union,否则会产生歧义。所以,

static const my_struct_t me3 = { .myfuncEx = myfuncEx_imp };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接