此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不能吗?
答案 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 *” “)。