Полиморфизм союзов C в массивах

Учитывая следующее:

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-объединения и полиморфизм")

Однако почему нельзя:

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

Это дает ошибку несовместимого типа без явного приведения. Есть ли способ избежать явного приведения?


person AFS    schedule 23.05.2012    source источник
comment
Пожалуйста, отредактируйте свой вопрос, поскольку он не является законным C в его нынешнем виде. C[2] cArray должен быть C cArray[2]. Тогда c[0] и c[1] должны быть cArray[0] и cArray[1].   -  person betabandido    schedule 23.05.2012
comment
transparent_union прозрачен только при передаче параметров в функции. Документация GCC очень подробно об этом говорит.   -  person n. 1.8e9-where's-my-share m.    schedule 23.05.2012
comment
Вы всегда можете просто добавить .a или .b, но это противоречит вашей цели, верно?   -  person Michael Dorgan    schedule 23.05.2012


Ответы (1)


В документации GCC говорится:

Этот атрибут, прикрепленный к определению типа объединения, указывает, что любой параметр функции, имеющий этот тип объединения, вызывает обращение к этой функции особым образом.

Другими словами, прозрачность применяется только к параметрам функции.

person David Heffernan    schedule 23.05.2012