访问不同结构的相同成员

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 的类型在这里是次要问题。主要问题是 unix 的地址根据 struct 中的 "active" 而改变 union:

  • 如果 a_ 为 "active",xunion 顶部的偏移量为零
  • 如果 b_ 是 "active",xunion 顶部的偏移量是 sizeof(float) 加上字段对齐可能的额外偏移量

此问题的一个解决方案是将 x 放在两个 structs:

的初始字段序列中的同一位置
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")。