C编程 - "派生"的基础结构类型类型

时间:2017-05-17 13:34:05

标签: c struct

这个想法是可以指向 Struct_A
的实例的指针 带有 BaseStruct 类型指针的 Struct_B 实例。

我可以创建一个"基础结构类型"在C中,如下所示,任何编译器? 我用GCC对它进行了测试并且有效,但我不确定它是否适用于所有... ...

#include <stdio.h>

typedef enum {
 StructType_A,
 StructType_B
} StructType;

// >>> base type <<<
typedef struct {
 StructType type;
} BaseStruct;

// >>> type A <<<
typedef struct {
 StructType type;
 int xyz;
 char blabliblub;
} Struct_A;

// >>> type B <<<
typedef struct {
 StructType type;
 long int abc;
} Struct_B;

int main () {
 Struct_A a;
 BaseStruct* ptr;

 a.type = StructType_A;
 a.xyz  = 7853;
 a.blabliblub = 'z';

 ptr = (BaseStruct*) &a;

 if (ptr->type == StructType_A) printf ("YAY :3\n");
}

1 个答案:

答案 0 :(得分:1)

首先,要回答您的问题,如果这两种类型具有不同的对齐要求,则不允许指向具有Struct_B类型指针的BaseStruct类型(参见{{3 }}):

  

6.3.2.3指针

     

(7)指向对象或不完整类型的指针可以转换为a   指向不同对象或不完整类型的指针。如果结果   指针未正确对齐指向类型的行为   未定义。

但是,您可以通过建立适当的联盟轻松克服这种情况:

typedef enum {
    StructType_A,
    StructType_B
} StructType;

// >>> type A <<<
typedef struct {
    int xyz;
    char blabliblub;
} Struct_A;

// >>> type B <<<
typedef struct {
    long int abc;
} Struct_B;

// >>> composite type <<<
typedef struct {
    StructType type;
    union {
        Struct_A a;
        Struct_B b;
    } content;
} Union_AB;


int main () {
    Struct_A a;
    a.xyz  = 7853;
    a.blabliblub = 'z';

    Union_AB anA;
    anA.type = StructType_A;
    anA.content.a.xyz = 7853;
    anA.content.a.blabliblub = 'Z';

    Union_AB someB;
    someB.type = StructType_B;
    someB.content.b.abc = 5653L;

    Union_AB* ptr = (&anA);
    if (ptr->type == StructType_A) printf ("YAY :3\n");

    ptr = (&someB);
    if (ptr->type == StructType_A) printf ("YAY :3\n");

    return 0;
}