为什么由类向导生成的消息映射中的函数地址明确提到了类的名称?
例如:
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)
所有三种变体都能正确编译
这只是好奇心.
所有三个变体都可以正确编译。
是的,它们在 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++ 标准的传递成员函数指针的方法。另外两个由微软的扩展工作。