C ++:在MSVC中使用__stdcall回调typedef

时间:2009-08-18 23:12:11

标签: c++ visual-c++ typedef

此typedef:

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

在BorlandCpp中编译得很好,但是,当我在msvc中编译它时,我必须删除WINAPI(这只是__stdcall的别名):

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

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

更新:我不得不从typedef中删除“WINAPI”,否则我得到了

 error C2059: syntax error : '('

为该行。

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

3 个答案:

答案 0 :(得分:14)

我相信VC ++你需要把调用约定放在()这里是MSDN上的example在函数指针typedef中使用调用约定。

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

这应该没有问题编译。

答案 1 :(得分:0)

函数指针必须包含有关函数使用的调用约定的信息。如果您指向使用__cdecl调用约定的函数,则必须使用__cdecl函数指针。如果您指向使用__stdcall调用约定的函数,则必须使用__stdcall函数指针。

希望这有帮助。

答案 2 :(得分:0)

附注:我认为函数签名typedef 永远不会表示为指针 typedef。

如果您已将CM_Open_DevNode_Key定义为非指针,那么跟随此回调签名的函数的任何头声明都可以简单地写为

CM_Open_DevNode_Key myFunc;

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

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

如果需要,这将允许更简单的代码和更具体的功能签名匹配。

更不用说指针typedef一般是邪恶的,因为它们不允许指定指向的内容的常量(臭名昭着的例子:“const PCHAR”与正确评估的“const CHAR *” “)。