Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么调用setConsoletrlHandler()会触发警告? 包括 布尔MyCtrlHandlerWord ctrlType{ 返回TRUE; } int mainvoid{ SetConsoletrlHandlerMyCtrlHandler,TRUE; 返回0; }_C_Windows_Mingw_Compiler Warnings - Fatal编程技术网

为什么调用setConsoletrlHandler()会触发警告? 包括 布尔MyCtrlHandlerWord ctrlType{ 返回TRUE; } int mainvoid{ SetConsoletrlHandlerMyCtrlHandler,TRUE; 返回0; }

为什么调用setConsoletrlHandler()会触发警告? 包括 布尔MyCtrlHandlerWord ctrlType{ 返回TRUE; } int mainvoid{ SetConsoletrlHandlerMyCtrlHandler,TRUE; 返回0; },c,windows,mingw,compiler-warnings,C,Windows,Mingw,Compiler Warnings,函数签名与以下项匹配: PHANDLER_例程类型定义指向此回调函数的指针。HandlerRoutine是应用程序定义的函数名的占位符 如果我用64位的MinGW交叉编译它,它可以工作: $ x86_64-w64-mingw32-gcc ctrl.c $ 但在32位中,我得到一个警告: $ i686-w64-mingw32-gcc ctrl.c ctrl.c: In function ‘main’: ctrl.c:8:27: warning: passing argument 1 of ‘Se

函数签名与以下项匹配:

PHANDLER_例程类型定义指向此回调函数的指针。HandlerRoutine是应用程序定义的函数名的占位符

如果我用64位的MinGW交叉编译它,它可以工作:

$ x86_64-w64-mingw32-gcc ctrl.c
$
但在32位中,我得到一个警告:

$ i686-w64-mingw32-gcc ctrl.c
ctrl.c: In function ‘main’:
ctrl.c:8:27: warning: passing argument 1 of ‘SetConsoleCtrlHandler’ from incompatible pointer type [-Wincompatible-pointer-types]
    8 |     SetConsoleCtrlHandler(MyCtrlHandler, TRUE);
      |                           ^~~~~~~~~~~~~
      |                           |
      |                           BOOL (*)(DWORD) {aka int (*)(long unsigned int)}
In file included from /usr/share/mingw-w64/include/windows.h:74,
                 from ctrl.c:1:
/usr/share/mingw-w64/include/wincon.h:249:68: note: expected ‘PHANDLER_ROUTINE’ but argument is of type ‘BOOL (*)(DWORD)’ {aka ‘int (*)(long unsigned int)’}
  249 |   WINBASEAPI WINBOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine,WINBOOL Add);
      |
$

我不明白为什么,因为MyCtrlHandler应该与PHANDLER_例程具有相同的类型。

这里的问题是u cdecl和u stdcall之间的差异。在一次成功的编译尝试中,您一定幸运地使用了默认的调用约定。你需要:

BOOL WINAPI MyCtrlHandler(DWORD ctrlType) {
    return TRUE;
}

这里的问题是cdecl和stdcall之间的区别。在一次成功的编译尝试中,您一定幸运地使用了默认的调用约定。你需要:

BOOL WINAPI MyCtrlHandler(DWORD ctrlType) {
    return TRUE;
}

您提供的链接在DWORD dwCtrlType中显示BOOL WINAPI HandlerRoutine;是否有必要使用完全相同的定义?这将是BOOL WINAPI MyCtrlHandler_uuDWORDCtrlType中的;是的,我尝试将其作为BOOL WINAPI MyCtrlHandlerWord ctrlType,它编译得很好,没有它,我得到了错误C2440'function':无法从'BOOL\uu cdecl*DWORD'转换为'PHANDLER\u例程'`您提供的链接在DWORD dwCtrlType中显示BOOL WINAPI HandlerRoutine;是否有必要使用完全相同的定义?这将是BOOL WINAPI MyCtrlHandler_uuDWORDCtrlType中的;是的,我尝试将其作为BOOL WINAPI MyCtrlHandlerWord ctrlType,它编译得很好,没有它,我得到了错误C2440'function':无法从'BOOL\uu cdecl*DWORD'转换为'PHANDLER\u例程'`在x64中,cdecl和stdcall是相同的。另一方面,在x86中,cdecl让调用者清理堆栈,而stdcall让被调用者清理堆栈。@ErykSun,啊,是的,我在过去已经意识到了这种差异,并且完全忘记了它。谢谢。在x64中,cdecl和stdcall是相同的。另一方面,在x86中,cdecl让调用者清理堆栈,而stdcall让被调用者清理堆栈。@ErykSun,啊,是的,我在过去已经意识到了这种差异,并且完全忘记了它。谢谢