来自 :: 命名空间的 MFC 函数? [复制]

Posted

技术标签:

【中文标题】来自 :: 命名空间的 MFC 函数? [复制]【英文标题】:MFC Functions from :: namespace? [duplicate] 【发布时间】:2019-12-10 16:11:12 【问题描述】:

不久前我开始使用 MFC,我遇到了函数或者更确切地说是方法,它们在函数名称之前使用“::”调用。这是什么?

例如:

::SendMessage()

那个范围是什么?如果我愿意,我该如何定义?

谢谢

【问题讨论】:

全局范围的方法就是这样调用的。 通常会省略:: 全局范围,但可能需要在不同的命名空间中消除相同标识符的歧义。 【参考方案1】:

函数名称前的:: 指定使用来自全局命名空间 的函数,而不是特定类的成员函数。正如您所发现的,这在MFC headers/source 中被广泛使用。

原因其实很简单。让我们考虑CWnd 类,它有一个SendMessage 成员函数,其签名如下:

class CWnd : public CObject 
//...
    LRESULT SendMessage(UINT msg, WPARAM wParam, LPARAM lParam);
//...

该函数的实现可以简单地将控制权传递给非MFC的同名全局WinAPI函数。但这有不同的签名:

LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

所以,当 成员函数 调用这个非 MFC 对象时,第一个参数是它的“自己的”HWND 对象,:: 前缀用于使任何人都清楚正在调用非 MFC 函数的未来编码人员:

LRESULT CWnd::SendMessage(UINT msg, WPARAM wParam, LPARAM lParam)

    return ::SendMessage(m_hWnd, msg, wParam, lParam); // Clarifies that we're using a non-class function.

请随时要求进一步解释和/或澄清。

【讨论】:

这里不需要使用完全限定名称。没有递归调用的风险。该类成员具有不同的签名,因此在overload resolution 期间将其作为候选者丢弃。 Unqualified name lookup 将在全局命名空间中查找名称。 @IInspectable 事实上,MFC 源确实使用 explicit 全局命名空间前缀。让事情变得更加清晰,我觉得。 (为正确起见已编辑帖子!) 就我个人而言,我总是是明确的。使用完全限定的名称更直接地表达意图,减少读者的精神负担,并防止未来的变化,这可能会引入最终会发生冲突的名称。它只是不是“必需” 我将如何为自己定义全局命名空间?如果我想向全局命名空间添加方法,或者创建空项目,我应该从哪里开始? @ligazetom 要添加到全局命名空间,只需定义一个全局函数——即不在任何其他命名空间或类中的函数,就像一个好的老式extern int MyFunction(int arg); on它自己的,某处。【参考方案2】:

:: 指的是 global 命名空间。

【讨论】:

【参考方案3】:

::SendMessage() 表示在全局命名空间中可用的方法。它不受任何特定类的范围的约束。

【讨论】:

以上是关于来自 :: 命名空间的 MFC 函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

XML名命空间

从函数内将变量插入全局命名空间? [复制]

在命名空间内定义函数时引发链接器错误? [复制]

命名空间有啥意义? [复制]

如果 MFC RUNTIME_CLASS 参数具有命名空间,则编译器错误

关于php的命名空间