输出如下:

g++ -DDEBUG -DUNITTEST -IC:/Users/Steven/Dropbox/Programming/entropy_p5_makefile/cpp/game/../include/ -O0 -g3 -Wall -c -fmessage-length=0 -o Input.o ..\Input.cpp
..\Input.cpp: In function 'void mousehookCustomRoutine(E_thread*, void*)':
..\Input.cpp:78:93: error: invalid conversion from 'LRESULT (*)(int, WPARAM, LPARAM)' to 'LRESULT (*)(int, WPARAM, LPARAM)'
..\Input.cpp:78:93: error:   initializing argument 2 of 'void* SetWindowsHookExA(int, LRESULT (*)(int, WPARAM, LPARAM), HINSTANCE__*, DWORD)'
Build error occurred, build is stopped

这是代码:
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
    //...
}

void mousehookCustomRoutine(E_thread *me, void *arg = (void *)&MouseHookProc) {
    // arg is the ptr to LL Mouse Routine

    me->sendMessage(0x14,me,(void*)GetCurrentThreadId());
    // send message to self in order for my parent to know how to identify me via threadID
    HHOOK mousehook = SetWindowsHookEx(WH_MOUSE_LL, (LRESULT (*)(int,WPARAM,LPARAM))arg,NULL, 0); // I am line 78
    if (mousehook == NULL) printf("Mousehook error %lu\n",GetLastError());
    //...
}

这没有任何意义,因为我正在强制转换为它期望接收的确切类型,没有任何限定符或其他不同的东西。这可能是怎么回事?

最佳答案

首先,不要将函数指针转换为void *。将一种类型的函数转换为另一种类型的函数永远都不安全,因此很少(如果有的话)将它们设置为void *

其次,可能您在调用约定方面看到了不同。正确说明了hook参数的类型是(LRESULT (CALLBACK *) (int, WPARAM, LPARAM)),或者只是HOOKPROC。该函数的原型(prototype)应类似于LRESULT CALLBACK MouseHookProc(int, WPARAM, LPARAM)。 gcc最有可能不会漂亮地显示调用约定说明符,但是会在检查类型等效性时对其进行检查。诸如此类的细微问题是不强制转换函数指针的另一个原因-如果您使用了(HOOKPROC)强制转换,则不会有编译时错误,但可能在运行时崩溃.. but only on certain versions of windows

关于c++ - 奇怪的 “invalid conversion from <type> to <type>”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7101013/

10-08 22:09