免责声明:以下是尽量简化问题。最初变量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
的“一般”访问权限?
答案 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
地址根据uni
中struct
“活跃”的内容而发生变化:
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")。