【问题标题】:C Union Polymorphism within Arrays数组中的 C 联合多态性
【发布时间】:2012-05-23 15:01:01
【问题描述】:

鉴于以下情况:

typedef struct{
...
...
} A;

typedef struct{
...
... 
} B;

typedef union __attribute__((transparent_union)) {
    A a;
    B b;
} C;

如果我声明一个函数

myMethod(C){
...
}

以下内容在没有显式转换的情况下是合法的:

A myA;
B myB;

meMethod(myA);
myMethod(myB);

(来自:“c unions and polymorphism”)

但是,为什么以下是不允许的:

C cArray[2];
c[0]=myA;
c[1]=myB;

这会在没有显式转换的情况下给出不兼容的类型错误。有什么办法可以避免显式转换?

【问题讨论】:

  • 请编辑您的问题,因为它不是合法的 C。 C[2] cArray 应该是 C cArray[2]。那么c[0]和c[1],应该是cArray[0]和cArray[1]。
  • transparent_union 仅在将参数传递给函数时是透明的。 GCC 文档对此非常明确。
  • 您总是可以只添加 .a 或 .b,但这违背了您的目的,对吧?

标签: arrays gcc polymorphism unions


【解决方案1】:

GCC documentation 声明:

附加到联合类型定义的该属性表示 任何具有该联合类型的函数参数都会导致对该联合类型的调用 以特殊方式处理函数。

换句话说,透明度只适用于函数参数。

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 2018-10-09
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多