有一个简单的代码,包含::
操作的不同用法。
namespace test{
int add(int x, int y){
return x + y;
}
}
int main(){
int x=3, y=5;
int r = ::test::add(x,y);
r = test::add(x,y);
}
或者在另一个例子中
::std::cout << "Hello";
std::cout << "Hello";
这些代码的功能(我的意思是 ::
before 语句的用法)没有什么不同。那为什么在语句之前使用 (::
) 呢?
区别在于一个是全限定名,一个不是全限定名。是否使用完全限定名称在这些示例中没有实际区别。它可以在另一种情况下产生影响。请参阅下面的示例。
要理解这个概念,如果您熟悉限定名称的其他情况,可能会有所帮助。
以 UNIX/LINUX 文件系统为例。路径分隔符是/与分隔符是::的 C++ namespace 相反。文件系统的根目录是/而全局 namespace 是::。根目录下有一个名为 foo 的文件。当前工作目录是根目录。路径/foo 和 foo 之间有什么区别?它们都引用同一个文件,但第一个是绝对的(即完全限定的)而另一个是相对的(不限定的)。现在考虑将工作目录更改为/bar。在此上下文中,相对路径现在指的是/bar/foo,不再指与/foo 相同的文件。
另一个类似的类比是网络。假设您在 bar.org 页面上。网址之间有什么区别http://bar.org/foo , bar.org/foo,//foo,/foo, 和 foo?它们都指代同一个实体。第一个是完全合格的,最后一个是不合格的,其他的都有不同程度的合格。如果您浏览到 bar.org/baz 或者 zap.org,相对 URL 会改变含义,而绝对不会。
C++ 名称查找比这些类似示例更复杂,因为它可以将相对名称与事件 namespace 的父 namespace 相匹配,而文件系统路径和 URL 通常不会。这种差异对您的示例案例没有影响。
此处的一个简单示例对名称进行限定确实有所不同:
int foo = 1;
namespace bar {
int foo = 2;
void baz() {
std::cout << foo;
std::cout << ::foo;
}
}