Visual Studio警告C4100和跟踪 在VisualStudio 2012中,当我尝试编译以下C++函数: void CCustToolBar::OnCustHelp(NMHDR* pNMHDR, LRESULT* /*pResult*/) { TRACE(_T("{ Help ID = %d }\n"), pNMHDR->idFrom); }

Visual Studio警告C4100和跟踪 在VisualStudio 2012中,当我尝试编译以下C++函数: void CCustToolBar::OnCustHelp(NMHDR* pNMHDR, LRESULT* /*pResult*/) { TRACE(_T("{ Help ID = %d }\n"), pNMHDR->idFrom); },c++,visual-c++,C++,Visual C++,我得到警告“warning C4100:'pNMHDR':未引用的形式参数” 这没有意义,因为pNMHDR正在使用。如果我试着把它评论出来: void CCustToolBar::OnCustHelp(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/) { TRACE(_T("{ Help ID = %d }\n"), pNMHDR->idFrom); } 我得到错误“error C2065:'pNMHDR':未声明的标识符” 这是有道理的 我错过了什么

我得到警告“warning C4100:'pNMHDR':未引用的形式参数”

这没有意义,因为pNMHDR正在使用。如果我试着把它评论出来:

void CCustToolBar::OnCustHelp(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/)
{
  TRACE(_T("{ Help ID = %d }\n"), pNMHDR->idFrom);
}
我得到错误“error C2065:'pNMHDR':未声明的标识符”

这是有道理的

我错过了什么?为什么在使用变量时会收到警告C4100?

的MSDN页面显示:

在MFC的调试版本中,此宏将指定的字符串发送到当前应用程序的调试器。在发布版本中,此宏编译为空(根本不生成代码)

因此,您必须在发布模式下编译以获得警告,因为整个
跟踪
调用将不存在于该配置中

如果将代码更改为:

void CCustToolBar::OnCustHelp(NMHDR* pNMHDR, LRESULT* /*pResult*/)
{
  #ifdef DEBUG
    TRACE(_T("{ Help ID = %d }\n"), pNMHDR->idFrom);
  #else
    UNREFERENCED_PARAMETER(pNMHDR);
  #endif
}

这将是一种干净的方法,可以避免在发布模式下出现警告,同时保留用于调试的预期功能。

如果
TRACE
仅在调试模式或其他模式下发生,我可以看到它未被使用。如果是这样,我希望当我试图在版本中用注释掉的变量构建它时,它不会抱怨(此行不起任何作用)。更多细节请参见。是的,我知道如何避开它。我只是好奇是什么导致了这一切。