C找到哪个指针调用函数

时间:2012-02-11 05:46:06

标签: c function-pointers currying

情境:

有多个C结构,每个结构包含一个指向同一函数的函数指针。如果需要,这些指针可以是不同的(指针指针等),但最终必须指向同一个函数。

问题:

当从其中一个指针调用函数时,我需要在函数中检索调用它的结构。

e.g。

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中实现它有任何想法。我有一些想法,但我最终回到了这个位置。

3 个答案:

答案 0 :(得分:3)

我认为在语言中没有任何方法可以做到这一点,而没有明确地将一些标识符(作为参数或全局)传递给myFunca_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);