访问不同结构的相同成员
accessing the same member of different structs
免责声明:以下是尽量简化问题。最初变量 int x
是一个结构,但我认为这在这里并不重要。
假设我们在一个联合中有两个结构(我对此没有影响)
typedef struct a_t {
int x;
int irrelevant;
} a_;
typedef struct b_ {
float also_irrelevant;
int x;
} b_;
typedef union uni_t{
a_ a;
b_ b;
} uni;
是否可以通过 ptr_to_struct->x
等相同的语句在两个结构中访问 x
?但是 afaik 指针在编译时需要正确的类型。所以一个依赖声明类似于这个伪代码
if (union contains a_)
{
a_ * ptr_to_struct; // but outside of this scope
ptr_to_struct = &(uni.a);
}
else
{
b_ * ptr_to_struct; // but outside of this scope
ptr_to_struct = &(uni.b);
}
据我所知是不可能的。
是否有可能 "general" 访问变量 x
而不受联盟当前状态的影响?
你是对的,这是不可能的。 ptr_to_struct
的类型在这里是次要问题。主要问题是 uni
中 x
的地址根据 struct
中的 "active" 而改变 union
:
- 如果
a_
为 "active",x
距 union
顶部的偏移量为零
- 如果
b_
是 "active",x
从 union
顶部的偏移量是 sizeof(float)
加上字段对齐可能的额外偏移量
此问题的一个解决方案是将 x
放在两个 struct
s:
的初始字段序列中的同一位置
typedef struct a_t {
int x;
int irrelevant;
} a_;
typedef struct b_t {
int x; // Moved to the top
float also_irrelevant;
} b_;
现在x
占据相同的位置,C makes a guarantee通过a.x
访问x
在union中的地址将是相同的或通过 b.x
.
这是不可能的。 C 没有反射,所以 "name" x 在运行时不可用。结构中也没有任何数据指示给定实例的类型(即它不是 "tagged union")。
免责声明:以下是尽量简化问题。最初变量 int x
是一个结构,但我认为这在这里并不重要。
假设我们在一个联合中有两个结构(我对此没有影响)
typedef struct a_t {
int x;
int irrelevant;
} a_;
typedef struct b_ {
float also_irrelevant;
int x;
} b_;
typedef union uni_t{
a_ a;
b_ b;
} uni;
是否可以通过 ptr_to_struct->x
等相同的语句在两个结构中访问 x
?但是 afaik 指针在编译时需要正确的类型。所以一个依赖声明类似于这个伪代码
if (union contains a_)
{
a_ * ptr_to_struct; // but outside of this scope
ptr_to_struct = &(uni.a);
}
else
{
b_ * ptr_to_struct; // but outside of this scope
ptr_to_struct = &(uni.b);
}
据我所知是不可能的。
是否有可能 "general" 访问变量 x
而不受联盟当前状态的影响?
你是对的,这是不可能的。 ptr_to_struct
的类型在这里是次要问题。主要问题是 uni
中 x
的地址根据 struct
中的 "active" 而改变 union
:
- 如果
a_
为 "active",x
距union
顶部的偏移量为零 - 如果
b_
是 "active",x
从union
顶部的偏移量是sizeof(float)
加上字段对齐可能的额外偏移量
此问题的一个解决方案是将 x
放在两个 struct
s:
typedef struct a_t {
int x;
int irrelevant;
} a_;
typedef struct b_t {
int x; // Moved to the top
float also_irrelevant;
} b_;
现在x
占据相同的位置,C makes a guarantee通过a.x
访问x
在union中的地址将是相同的或通过 b.x
.
这是不可能的。 C 没有反射,所以 "name" x 在运行时不可用。结构中也没有任何数据指示给定实例的类型(即它不是 "tagged union")。