我现在已经看过几次了,我一直在想我为什么......
例如:(http://www.codeguru.com/forum/showthread.php?t=377394)
void LeftClick ( )
{
INPUT Input={0};
// left down
Input.type = INPUT_MOUSE;
Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
::SendInput(1,&Input,sizeof(INPUT));
// left up
::ZeroMemory(&Input,sizeof(INPUT));
Input.type = INPUT_MOUSE;
Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
::SendInput(1,&Input,sizeof(INPUT));
}
这个例子在没有::(范围)运算符的情况下工作,为什么它们甚至在那里?
答案 0 :(得分:26)
这基本上意味着“获取GLOBAL范围的功能,而不是当前可见的功能”。
void SendInput() { /* (1) */
}
namespace derp {
void SendInput() { /* (2) */
}
void LeftClick() {
...
::SendInput(); /* matches (1) */
SendInput(); /* matches (2) */
}
}
答案 1 :(得分:3)
假设您有以下内容:
void bar()
{
}
struct Foo
{
void bar();
};
如果要从成员函数bar
调用全局函数Foo::bar
,请使用空左侧的语法:
void Foo::bar()
{
// Call the global bar function, not recursively call myself
::bar();
}
答案 2 :(得分:2)
强制进行绝对名称解析 如果没有它,则会针对类/函数命名空间路径搜索名称解析。
因此假设LeftClick()位于命名空间层次结构中:
namespace Level1
{
namespace Level2
{
namespace Level3
{
LeftClick()
{
::SendInput(); // Absolute path only. SendInput in global namespace
SendInput(); // Relative path (Note resolved at compile time)
//
// Looks for the function here (in this order)
// ::Level1::Level2::Level3::SendInput()
// ::Level1::Level2::SendInput()
// ::Level1::SendInput()
// ::SendInput()
}
}
}
}
如果您有一个嵌套名称,那就更有趣了:
namespace Level1
{
namespace Level2
{
namespace Level3
{
LeftClick()
{
::Test::Action(); // Absolute Path: Function Action()
// in namespace Test
// in global namespace
Test::Action(); // Relative Path: Function Action()
// in namespace Test
// in current namespace path.
//
// It will Look for Test (in this order)
// ::Level1::Level2::Level3::Test
// ::Level1::Level2::Test
// ::Level1::Test
// ::Test
//
// In the first Test (and only the first) it finds it will
// try and resolve the Action() function. If it is not there
// it is a compile time error.
}
}
}
}
答案 3 :(得分:1)
强制将符号放在全局范围内。
void foo() {} // 1
namespace A
{
void foo() {} // 2
void bar()
{
foo(); // 2
::foo(); // 1
}
}
答案 4 :(得分:0)
以这种方式使用范围运算符意味着您指的是全局范围。
为了节省宝贵的时间和按键,请查看scope resolution operator without a scope。
答案 5 :(得分:0)
::
用于直接从对象外部访问对象。