Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在VC&x2B+;通知回调NMHDR*是否可以为空?_C++_Visual C++_Mfc - Fatal编程技术网

C++ 在VC&x2B+;通知回调NMHDR*是否可以为空?

C++ 在VC&x2B+;通知回调NMHDR*是否可以为空?,c++,visual-c++,mfc,C++,Visual C++,Mfc,下面是从中提取的一些示例代码。在我看到的所有示例中,它都没有检查NMHDR*是否为null。它可以为null还是保证不为null void CListCtrlDlg::OnDblClk(NMHDR* pNMHDR, LRESULT* pResult) { UNREFERENCED_PARAMETER(pResult); LPNMITEMACTIVATE pia = (LPNMITEMACTIVATE)pNMHDR; LVHITTESTINFO lvhti; //

下面是从中提取的一些示例代码。在我看到的所有示例中,它都没有检查NMHDR*是否为null。它可以为null还是保证不为null

void CListCtrlDlg::OnDblClk(NMHDR* pNMHDR, LRESULT* pResult)
{
    UNREFERENCED_PARAMETER(pResult);
    LPNMITEMACTIVATE pia = (LPNMITEMACTIVATE)pNMHDR;
    LVHITTESTINFO lvhti;

    // Clear the subitem text the user clicked on.
    lvhti.pt = pia->ptAction;
    m_myListCtrl.SubItemHitTest(&lvhti);

    if (lvhti.flags & LVHT_ONITEMLABEL)
    {
        m_myListCtrl.SetItemText(lvhti.iItem, lvhti.iSubItem, NULL);
    }
}

如果MFC框架响应相关的
WM\u NOTIFY
消息调用了处理程序,如您显示的
clistCtldG::OnDblClk
函数,则
NMHDR*
参数将不会为
NULL

然而,手动调用这样的处理函数是可能的,在这种情况下,参数可以有调用代码(r)给出的任何值


因此,在长期安全和/或维护方面——特别是在处理由其他程序员访问和/或修改的代码库时,您对这些代码库几乎没有控制权或没有控制权——您可能希望检查指针的有效性。

我猜不可能吧?我不确定它为空是否有意义。但是显式测试它的开销非常小,而且您可以随时安装MFC源代码并检查调用它的代码,看看是否会生成null。顺便说一句,“为了更好的长期安全性”,我会选择相反的方法:不要检查
nullptr
。只要根据有效的假设行事,即此参数永远不能是
nullptr
,并无条件地取消引用它。如果有人执行了错误的更改(如直接调用通知处理程序),则会使您的程序立即崩溃。这有两个好处:编辑可以立即得到反馈,而反馈是他们不能(意外地)忽略的。@IInspectable我不能也不会质疑你的理念。完全我只是说有可能得到
nullptr
第一个参数;这甚至可以作为一个特性来实现,其中“其他程序员”添加了对
nullptr
的相关检查,并相应地处理它。例如,在另一个控件中模拟双击的按钮单击。“模拟双击”已经有问题了。注入真正的双击(使用
SendInput
),或触发双击效果(使用UI自动化或类似模式)。这也不仅仅是哲学:这是我在许多MFC代码库中使用和介绍的东西。即使在那些最初遭到不满的时候,它也成功地拒绝了快速而肮脏的黑客攻击(又称技术债务),并为每个合理的用例提供了完全的忠实性。@I再次证明,对于我在最后一次评论中给出的“示例用法”的可质疑性,没有任何争议。此外,我还对我的答案进行了编辑,以使其更倾向于表明覆盖框架在任何方面都是可以接受的。一如既往,我感谢你富有洞察力的评论。