我看到这两个词组的用法:全球范围内和全局命名空间。 它们之间有什么区别?
Answer 1:
在C ++中,每一个名字都有它的范围之外,它不存在。 作用域可以通过多种方式来定义:它可以通过命名空间 , 函数 , 类 ,只是{}来定义。
因此,一个命名空间,全球或以其他方式,定义了一个范围。 全局命名空间是指使用::
,并在此命名空间中定义的符号被认为具有全局范围。 符号,默认情况下,存在于一个全局命名空间,除非它被定义内的块与关键字开始namespace
,或者它是一个类的成员,或函数的一个局部变量:
int a; //this a is defined in global namespace
//which means, its scope is global. It exists everywhere.
namespace N
{
int a; //it is defined in a non-global namespace called `N`
//outside N it doesn't exist.
}
void f()
{
int a; //its scope is the function itself.
//outside the function, a doesn't exist.
{
int a; //the curly braces defines this a's scope!
}
}
class A
{
int a; //its scope is the class itself.
//outside A, it doesn't exist.
};
另外请注意,一个名字可以通过任一的命名空间,函数或类中定义范围内被隐藏。 所以这个名字a
内部命名空间N
隐藏名称a
全球namspace。 以同样的方式,在函数和类的名称隐藏在全局命名空间的名称。 如果你遇到这样的情况,那么你可以使用::a
指在全局命名空间中定义的名称:
int a = 10;
namespace N
{
int a = 100;
void f()
{
int a = 1000;
std::cout << a << std::endl; //prints 1000
std::cout << N::a << std::endl; //prints 100
std::cout << ::a << std::endl; //prints 10
}
}
Answer 2:
“范围”是不是“命名”更总称。 每命名空间,类和码块定义一个范围,其中声明的名称在它里面都可以使用; 命名空间是外面类和函数声明的名称的容器。
“全球范围”和“全局命名空间”可以或多或少地互换使用; 在一个命名空间中声明的名称的范围覆盖该命名空间。 如果你指的是其内部名称的知名度使用“命名空间”,如果你具体指的命名空间,和“范围”。
Answer 3:
适用范围表示对象的生命周期,你可以有你的程序执行,这将是长期存在的一个全局变量,或者你可以有一个块作用域的变量,只要代码块执行会存在。 考虑下面这个例子:
#include <iostream>
int a = 100;
main () {
int a = 200;
std::cout << "local a is: " << a << std::endl;
std::cout << "global a is: " << ::a << std::endl;
return 0;
}
当执行该语句将打印local a is: 200
,这显然是预期的,因为我们正在重新定义a
在main
留下的范围,它的封闭块。 我们还打印了全球::a
再次打印预期值100,因为我们所要求的全局命名空间::
。
命名空间的语义大多是合乎逻辑的,它是从彼此隔离symblos,希望避免名称冲突的一种方式,它不会影响对象的生命周期。
在另一方面范围,表示对象,全球的寿命a
弹簧进入存在本地前a
,因为它被建造比主被执行的要早得多。 然而,范围也将强制符号命名空间,但不能以同样的方式,一个namespace
一样。 有不同种类范围的global
, class
, function
, block
, file
等...
混乱的部分是,范围有时重载表示特定符号,而这是从C,其中的命名空间的概念不存在和范围的借用被用来表示这两个,寿命和可视性的可见性。 在C ++,但是规则改了一下,但这个词范围仍然采用同样的方式,因为这两种语言共享的概念很大。
Answer 4:
当你声明一个全局变量int i
例如,我们说i is in the global namespace
,并has the global namespace scope
。 就这样。
摘自C ++ 03:
3.3.5 Namespace scope
The outermost declarative region of a translation unit is also a namespace, called
the global namespace. A name declared in the global namespace has global namespace
scope (also called global scope).
Answer 5:
@Dmitriy Ryajov
主题是有点老了,但我想我提供这个帮助。 我认为你不应该让事情变得更复杂得多,他们真的是。 Scope
的标识符是该标识,即是指在程序某些实体的名称,可被用来寻找被称为实体的计算机程序的一部分。 所以说,范围只适用于标识符,我们不应该与对象的生命周期混合它。 他们有些连接,但不应该混淆。 对象的生存期由我们分配该对象的存储器表示。 因此,举例来说,如果一个内存在栈上分配的,将尽快完成功能中解脱出来。 所以,这取决于我们存储的对象和表示其寿命。 范围只是说:“这是一个对象的名称,我们可以为对象使用这个名字,直到然后再”。 所以,正如我所说的,术语scope
只是针对对象的标识符,寿命是别的东西至极由我们存储的对象表示。
此外,我想谈谈linkage
这是密切与此有关。 这可有时也令人困惑。 比方说,我们在一些标识符translation unit
引用某些对象。 无论是在相同的标识符other
翻译单元将指向同一个实体是由联动表示。 因此,例如,如果一个标识符具有外部连接,我们可以参考该实体,该标识符是指但来自其他翻译单元通过用关键字声明它extern
。 现在,让我们说,我们不希望使用该实体在其他翻译单元。 然后,该实体将exist
,直到程序结束,但是,当我们不申报的话,我们将无法参考。 还要注意的是,现在我是混合性条款联动和寿命。 但是,这是因为只有global
实体具有外部链接。 在函数内部的标识符不能从程序的其它部分refered到。
结论:总是试图让事情变得简单。 我很惊讶人们如何不同谈谈这方面有所不同。 独立编译的整个过程是混乱的,因为存在具有几乎相同的含义,可能每个人都会遇到困难,在这一点上的多个方面。