【问题标题】:C++: Callback typedefs with __stdcall in MSVCC++:在 MSVC 中使用 __stdcall 回调 typedef
【发布时间】:2010-11-20 18:56:49
【问题描述】:

这个类型定义:

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 不能吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        旁注:我认为函数签名 typedef 不应该 表示为 pointer typedef。

        如果您已将 CM_Open_DevNode_Key 定义为非指针,则遵循此回调签名的函数的任何标头声明都可以简单地编写为

        CM_Open_DevNode_Key myFunc;

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

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

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

        更不用说指针类型定义通常是邪恶的,因为它们不允许指定所指向的 content 的常量(臭名昭著的例子:“const PCHAR”与正确评估的“const CHAR * ")。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 2015-09-25
          • 1970-01-01
          • 1970-01-01
          • 2013-12-23
          • 2015-09-16
          • 1970-01-01
          相关资源
          最近更新 更多