这个想法是可以指向 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");
}
答案 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;
}