访问不同结构的同一成员

时间:2018-03-28 11:48:29

标签: c unions

免责声明:以下是尽量简化问题。最初变量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;

是否可以通过x这样的语句访问两个结构中的ptr_to_struct->x?但是afaik指针在编译时需要正确的类型。所以一个类似于这个Pseudocode的dependend声明

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);
}
据我所知,

是不可能的。

是否有可能独立于联盟的当前状态获得对变量x的“一般”访问权限?

2 个答案:

答案 0 :(得分:1)

你是对的,这是不可能的。 22 def custom_loss_keras(y_true, y_pred): ---> 23 loss = tf.cond(K.greater(K.sum(y_true),0), K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1), 0.0) 24 25 return loss ~/anaconda3/lib/python3.6/site-packages/tensorflow/python/ops/control_flow_ops.py in cond(pred, fn1, fn2, name) 1718 with ops.name_scope(name, "cond", [pred]) as name: 1719 if not callable(fn1): -> 1720 raise TypeError("fn1 must be callable.") 1721 if not callable(fn2): 1722 raise TypeError("fn2 must be callable.") TypeError: fn1 must be callable. 的类型是次要问题。主要问题是ptr_to_struct内的x地址根据unistruct“活跃”的内容而发生变化:

  • 如果union处于“有效”状态,则a_x顶部的偏移量为零
  • 如果union处于“有效”状态,b_顶部x的偏移量为union加上字段对齐可能的额外偏移量

此问题的一个解决方案是将sizeof(float)放在x s的初始字段序列中的同一位置:

struct

现在typedef struct a_t { int x; int irrelevant; } a_; typedef struct b_t { int x; // Moved to the top float also_irrelevant; } b_; 占据相同的位置,C makes a guarantee如果您通过x或通过x访问联盟中a.x的地址将会相同b.x

答案 1 :(得分:1)

这是不可能的。 C没有反射,所以" name" x在运行时不可用。结构中也没有任何数据表明给定实例的类型(即它不是"tagged union")。