gpt4 book ai didi

c++ - MFC的消息映射,不需要&?

转载 作者:搜寻专家 更新时间:2023-10-31 00:02:53 26 4
gpt4 key购买 nike

我一直在寻找这个问题的答案,但似乎很难得到它,这让我终于来到了这里。

这是一种语法,我们必须将 & 放在指向成员函数的指针之前。例如这里。

class Test;
typedef void (Test::*fpop)();
class Test
{
public:
void Op1(){}
};

int main(){
fpop pFunc;
pFunc = &Test::Op1; // we must need the &

return 0;
}

但是,当我查看 MFC 中的 ON_COMMAND(或任何其他消息)时,它似乎与我认为正确的有点不同。

VS6.0没问题。它遵循如下所示的正确语法。在memberFxn之前可以清楚的看到&。

#define ON_COMMAND(id, memberFxn) \   // VS6.0
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn },
// ON_COMMAND(id, OnFoo) is the same as
// ON_CONTROL(0, id, OnFoo) or ON_BN_CLICKED(0, id, OnFoo)

但在 VS2008 中,它变得有点奇怪。 memberFxn前没有&。

#define ON_COMMAND(id, memberFxn) \    // VS2008
{ WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, \
static_cast<AFX_PMSG> (memberFxn) },
// ON_COMMAND(id, OnBar) is the same as
// ON_CONTROL(0, id, OnBar) or ON_BN_CLICKED(0, id, OnBar)

此外,尽管memberFxn之前没有&,下面的每一行都完美无缺。

  1. ON_COMMAND(ID_APP_ABOUT, CSingleApp::OnAppAbout)//&
  2. ON_COMMAND(ID_APP_ABOUT, &CSingleApp::OnAppAbout)//没有 &

我试图找出原因,我很好奇这是否可能是因为 static_cast<> 但事实证明 static_cast 与它无关。

所以我想知道为什么在 VS2008 中我有 2 个选择放置 & 或者我不必放置 &。

最佳答案

Visual C++ 编译器(VS2005 和 VS2008)需要一个符号 (&) 和完全限定名称以按照 C++ 标准形成指向成员的指针,如下所示:

class Test
{
public:
void Foo() {}

void Bar()
{
void (Test::*ptr1)() = Foo; // C3867
void (Test::*ptr2)() = &Foo; // C2276
void (Test::*ptr3)() = Test::Foo; // C3867
void (Test::*ptr4)() = &Test::Foo; // OK
}
};

出于向后兼容性的原因,很可能在 MFC header 中有 #pragma 或抑制错误的内容。与较新的编译器相比,旧版本的 VC++ 远不符合

关于c++ - MFC的消息映射,不需要&?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7253568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com