如何将地址转换为函数指针到调用方法

时间:2009-07-08 12:22:56

标签: c++ c multithreading function-pointers

我想在Wait CallFunc()函数中调用Test()方法。

代码:

typedef void (*func)();

void StartTimer(void* pFuncAddr);
void WaitAndCallFunc(void* pPtr);

void WaitAndCallFunc(void* pPtr)
{
    int i = 0;
    int nWaitTime = 3;

    while(1)
    {
        Sleep(1000);
    //  I want pPtr to call Test1 Function;
        if(i == nWaitTime)
            break;
    }

    _endthread();
}
void StartTimer(void* pFuncAddr)
{
    _beginthread(WaitAndCallFunc, 0, pFuncAddr);
}
void Test1();
int main(int argc, char* argv[])
{

    StartTimer(Test1);

    Sleep(5000);

    return 0;
}

void Test1()
{
    cout << "Testing Thread\n";
}

4 个答案:

答案 0 :(得分:5)

我不确定我明白你的问题是什么,但试试这个:

((func)pPtr)();

答案 1 :(得分:3)

演员和电话:

typedef void (*func)();

void WaitAndCallFunc(void* pPtr)
{
    int i = 0;
    int nWaitTime = 3;

    while(1)
    {
        Sleep(1000);

        func f=(func)pPtr;   // cast to correct pointer to function type
        f();                 // and call!

        if(i == nWaitTime)
                break;
    }

    _endthread();
}

答案 2 :(得分:3)

严格来说,你不应该在函数指针和其他类型的指针之间进行转换。它无法保证按预期工作。

因此,一个更迂腐正确的版本看起来像:

struct hook {
    void (*func)();
};

void StartTimer(void* pFuncAddr);
void WaitAndCallFunc(void* pPtr);

void WaitAndCallFunc(void* pPtr)
{
    struct hook *hook_ptr = pPtr;

    hook_ptr->func();

    _endthread();
}

void StartTimer(void* pFuncAddr)
{
    _beginthread(WaitAndCallFunc, 0, pFuncAddr);
}

void Test1();

int main(int argc, char* argv[])
{
    struct hook hook_test1 = { &Test1 };

    StartTimer(&hook_test1);

    Sleep(5000);

    return 0;
}

请注意,在这里,它是与void *进行强制转换的结构指针,而不是函数指针本身。如果你需要将它们传递给Test1(),你还可以在结构中填充更多的值。

答案 3 :(得分:2)

实际上,将函数指针转换为void *或void *转换为函数指针在当前C或C ++中不允许直接 - 即使大多数编译器都编译它。

有两种方法可以在不编译直接转换的编译器上来回转换(使用C语法):

方法1(首先转换为整体中介)

((func) (intptr_t) pPtr)();  // call the void*

StartTimer( (void*) (intptr_t) &Test1); // pass function pointer to void*

方法2(使用void **)

func f = 0;
*((void**)&f) = pPtr;
f();  

StartTimer( *((void**) &Test1)); // pass function pointer to void*

您可以参考以下主题获取更多解释:Function pointers casting in C++