有多个C结构,每个结构包含一个指向同一函数的函数指针。如果需要,这些指针可以是不同的(指针指针等),但最终必须指向同一个函数。
当从其中一个指针调用函数时,我需要在函数中检索调用它的结构。
typedef struct A {
void * (*func)();
... /* Custom properties */
} * A;
typedef struct B {
void * (*func)();
... /* Custom properties */
} * B;
A a_init() {
A a;
... /* Custom initialisation, allocation, etc. */
a->func = myFunc;
return a;
}
B b_init() {
B b;
... /* Custom initialisation, allocation, etc. */
b->func = myFunc;
return b;
}
int main () {
A a = a_init();
void *something = a->func();
}
void * myFunc () {
// Need to get pointer to the instance of the struct this was called from here
}
有没有办法可以在myFunc
内找到指向调用者的指针?如果有必要,我正在考虑为函数创建指针等指针,因此对象的每个实例都会有一个不同的指针,并将它们全部存储在一个中心位置以匹配它们,但这显然不会如果我甚至找不到对象的实例或使用的指针,则工作。有什么想法吗?
这个问题的意图比我似乎提出的要广泛得多。 Currying将是一个很好的解决方案,如果有人对如何在C中实现它有任何想法。我有一些想法,但我最终回到了这个位置。
答案 0 :(得分:3)
我认为在语言中没有任何方法可以做到这一点,而没有明确地将一些标识符(作为参数或全局)传递给myFunc
。 a_init()
的地址存在于调用堆栈中,但是无法从程序中访问。
如果有人突然出现在你家门口,你怎么会在不问的情况下找出那个人来自哪里?
答案 1 :(得分:1)
你做不到。但是,你可以做的是定义你的struct
:
typedef struct A {
/* ... */
void *(*func)(void *);
} A;
typedef struct B {
/* ... */
void *(*func)(void *);
} B;
你的功能如下:
void *myFunc(void *the_struct) {
/* ... */
}
并且这样打电话:
A a = a_init();
void *something = a->func(a);
或者,如果您不关心可移植性并且由于某种原因需要能够像a->func()
那样调用它,您可以创建添加在参数中的thunk / trampolines。
答案 2 :(得分:1)
无法完成。
在C ++中调用成员函数时,编译器会隐式添加this
作为第一个函数参数。在C中模仿obj->method()
语法将无效,因为没有隐式this
。
这并不意味着OO在C中是不可能的,只是因为你不能使用与C ++或Java相同的语法。它仍然可以完成,但你必须明确:
void * myFunc (void *this) {
...
}
a->func(a);
b->func(b);