MFC消息映射中的函数地址

Jab*_*cky 9 c++ mfc

为什么由类向导生成的消息映射中的函数地址明确提到了类的名称?

例如:

ON_BN_CLICKED(IDC_CHECK1, &CMyDlg::OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)

代替:

ON_BN_CLICKED(IDC_CHECK1, &OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)

甚至:

ON_BN_CLICKED(IDC_CHECK1, OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)

所有三种变体都能正确编译

这只是好奇心.

pab*_*285 2

所有三个变体都可以正确编译。

是的,它们在 MSVC 上正确编译。如果您尝试在 Clang(Microsoft 兼容模式)中编译第二个或第三个示例,您将收到错误。

ON_BN_CLICKED(IDC_CHECK1, &OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)

产量Clang : must explicitly qualify name of member function when taking its address

ON_BN_CLICKED(IDC_CHECK1, OnClickedSomeButton)
Run Code Online (Sandbox Code Playgroud)

产量Clang : call to non-static member function without an object argument

即使您从不想发布除 MSVC 编译的二进制文件之外的其他文件,坚持使用第一种形式绝对是更好的选择 - 您可能想要使用需要 clang 编译的工具,例如 clang-tidy。它也是唯一符合 C++ 标准的传递成员函数指针的方法。另外两个由微软的扩展工作。