Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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
C++ C++;:MSVC中带有u stdcall的回调typedef_C++_Visual C++_Typedef - Fatal编程技术网

C++ C++;:MSVC中带有u stdcall的回调typedef

C++ C++;:MSVC中带有u stdcall的回调typedef,c++,visual-c++,typedef,C++,Visual C++,Typedef,此类型定义: typedef DWORD WINAPI (* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 在BorlandCpp中编译很好,但是,当我在msvc中编译它时,我必须删除WINAPI(这只是\uu stdcall的别名): 为什么会这样?我可以安全地删除WINAPI部件吗 更新:我必须从typedef中删除“WINAPI”,否则我会 error C2059: syntax error : '('

此类型定义:

typedef DWORD WINAPI
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);
在BorlandCpp中编译很好,但是,当我在msvc中编译它时,我必须删除
WINAPI
(这只是
\uu stdcall
的别名):

为什么会这样?我可以安全地删除WINAPI部件吗

更新:我必须从typedef中删除“WINAPI”,否则我会

 error C2059: syntax error : '('
排队


你能告诉我为什么Borland可以用“WINAPI”编译它,而Msvc不能吗?

函数指针必须包含函数使用的调用约定的信息。如果要指向使用uu cdecl调用约定的函数,则必须使用u cdecl函数指针。如果指向使用u stdcall调用约定的函数,则必须使用u stdcall函数指针


希望这能有所帮助。

我相信在VC++上,您需要将调用约定放在()中,这是一个关于在函数指针typedef中使用调用约定的MSDN

typedef DWORD (WINAPI * CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);

这应该可以毫无问题地编译。

旁注:我认为函数签名typedefs永远不应该表示为指针

如果您已经将CM_Open_DevNode_键定义为非指针,那么遵循此回调签名的函数的任何头声明都可以简单地写成

CM_Open_DevNode_Key myFunc

而不是过于冗长/容易出错

DWORD WINAPI myFunc(DWORD,DWORD,DWORD,DWORD,PHKEY,DWORD)

这将允许更简单的代码和更具体的函数签名匹配(如果需要)

更不用说指针typedef通常是有害的,因为它们不允许指定所指向内容的常量(臭名昭著的示例:“constpchar”与正确计算的“constchar*”)

typedef DWORD (WINAPI * CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);