可以说我有这个结构:
typedef struct nKey { int num; widget* widget; } NUMBER_KEY;
和功能:
void dialKey(widget* widget) { // Need to print 'num' of the struct that this widget resides in }
我该如何完成这项工作?我尝试过类似的东西:
printf("%d", * (int *) widget - sizeof(int)); // Failure.org
编辑:可以安全地假设传递的窗口小部件实际上是NUMBER_KEY结构的成员
编辑:寻找问题的解决方案而不是另一种方法.
正如迈克尔在他的回答中解释的那样,你无法用给定的约束来做到这一点,因为没有办法"向后走"指针图.为了使事情更加明显,让我绘制一个对象图(用C语言表示,而不是OOP意义上):
+- NUMBER_KEY --+ | ... | points to | widget field -+-----------+ | ... | | +---------------+ | + widget + +-->| ... | | ... | +-->| ... | | +--------+ points to | [widget argument]-----------+
注意箭头.它们是单向的 - 你可以从指针"走"到指向值,但你不能"走"回来.所以你可以推导widget
你的函数的参数来到达widget
对象,但是一旦那里,就没有办法告诉别人指向它 - 包括NUMBER_KEY
结构的任何实例.想想看:如果你有十几个其他指针widget
,其中一些来自不同的NUMBER_KEY
对象怎么办?如何在不保留widget
对象内所有指针的列表的情况下跟踪它?如果你确实需要这个,那就是你必须要做的 - widget
指出它拥有它NUMBER_KEY
.