声明区域(declaration region),是可以在其中进行声明的区域。例如函数内声明的变量其声明区域是其声明所在的代码块;函数外声明的全局变量,其声明区域为其声明所在的文件。
潜在作用域(potential scope),变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。
然而变量并非在其潜在作用与内的任何位置都是可见,因为它可能被另一个嵌套声明区域中声明的同盟变量隐藏。
名称空间可以是全局的也可以位于另一个名称空间中,但不能位于代码块中。因此在默认情况下,在名称空间中声明的名称的链接性是外部的(除非它引用了常量)。
除了用户定义的名称空间外,还存在全局名称空间,之前所说的全局变量就位于全局名称空间中。
using声明和using编译指令
using声明使特定的标识符可用,using编译指令使整个名称空间可用。
using std::out; // using声明
using namespace std; //using编译指令
如果某个名称已经在函数中声明了,则不能使用using声明导入相同名称的变量。而使用using编译指令时,如果存在相同名称变量,则局部名称将隐藏全局名称。
namespace Jill {
double bucket(double n) {...}
double fetch;
struct Hill {...};
}
// 其一
char fetch; // global namespace
int main() {
using namespace Jill; //import all namespace names
Hill Thrill; //create a type Jill::Hill structure
double fetch; // not an error; hides Jill::fetch; this is a local fetch
cin >> fetch; //read a value into the local fetch
cin >> ::fetch; //read a value into global fetch
cin >> Jill::fetch; //read a value into Jill::fetch
}
//其二
char fetch; // global fetch
int main() {
using Jill:fetch; // get an error, conflict with global fetch
}