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);