来自 :: 命名空间的 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 函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章