using
编译指令:它由名称空间名和它前面的关键字 using namespace
组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符。在全局声明区域中使用 using
编译指令,将使该名称空间的名称全局可用;在函数或代码块中使用 using
编译指令,将使其中的名称在该函数或代码块中可用。当包含 using
声明的最小声明区域中已经声明了和名称空间中相同的名称时,若仍使用 using
声明导入该名称空间的同名名称,则这两个名称将会发生冲突,编译器会报错。与 using
声明不同的是,using
编译指令会进行名称解析,在一些时候名称空间的变量会被同区域声明的同名变量隐藏,不会出现名称冲突的报错。但在另一些情况下,使用 using
编译指令仍会出现名称冲突的报错,下面对此进行总结,测试所用的环境为 Microsoft Visual Studio 2019 以及 QT 5.9.2 MinGW 32bit。
1 using 编译指令与同名全局变量
结论:若仅存在同名全局变量,不存在同名局部变量,使用 using
编译指令后,在作用域的重合区域使用变量时一定会引发名称冲突。除非在同名全局变量声明前的代码块中使用,但这时是因为同名变量的作用域不重合,而非 using
编译指令名称解析的功劳。
1.1 在同名全局变量声明前使用
若在同名全局变量声明前的代码块中使用,由于作用域不重合,一定不会引发名称冲突,因此只需测试在同名全局变量声明前的全局区中使用 using
编译指令的效果。测试程序如下:(出现名称冲突报错)
#include <iostream>
//自定义名称空间
namespace Jack {
double pail = 1;
}
//在同名全局变量声明前使用
using namespace Jack;
//在全局名称空间中定义变量
double pail = 2;
//测试
int main()
{
using namespace std;
//使用
cout << pail << endl;
cout << ::pail << endl;
cout << Jack::pail << endl;
return 0;
}
运行结果如下:
1.2 在同名全局变量声明后的全局区中使用
测试程序如下:(出现名称冲突报错)
#include <iostream>
//自定义名称空间
namespace Jack {
double pail = 1;
}
//在全局名称空间中定义变量
double pail = 2;
//在同名全局变量声明后使用
using namespace Jack;
//测试
int main()
{
using namespace std;
//使用
cout << pail << endl;
cout << ::pail << endl;
cout << Jack::pail << endl;
return 0;
}
运行结果如下:
1.3 在同名全局变量声明后的代码块中使用
测试程序如下:(出现名称冲突报错)
#include <iostream>
//自定义名称空间
namespace Jack {
double pail = 1;
}
//同名全局变量声明
double pail = 2;
//测试
int main()
{
using namespace std;
//使用
using namespace Jack;
cout << pail << endl;
cout << ::pail << endl;
cout << Jack::pail << endl;
return 0;
}
运行结果如下:
2 using 编译指令与同名局部变量
结论:若仅存在同名局部变量,不存在同名全局变量,使用 using
编译指令将会进行名称解析,不会引发名称冲突,但在代码块中,同名局部变量将隐藏名称空间中的变量。
2.1 在同名局部变量声明前的全局区中使用
测试程序如下:(运行成功)
#include <iostream>
//自定义名称空间
namespace Jack {
double pail = 1;
}
//在同名局部变量声明前的全局区中使用
using namespace Jack;
//测试
int main()
{
using namespace std;
//同名局部变量
double pail = 2;
//使用
cout << pail << endl; //结果为2
cout << ::pail << endl; //结果为1
cout << Jack::pail << endl; //结果为1
return 0;
}
运行结果如下:
2.2 在同名局部变量声明前的代码块中使用
测试程序如下:(运行成功)
#include <iostream>
//自定义名称空间
namespace Jack {
double pail = 1;
}
//测试
int main()
{
using namespace std;
//在同名局部变量声明前的代码块中使用
using namespace Jack;
//同名局部变量
double pail = 2;
//使用
cout << pail << endl; //结果为2
cout << Jack::pail << endl; //结果为1
return 0;
}
运行结果如下:
2.3 在同名局部变量声明后使用
若在同名局部变量声明后的全局区中使用,由于作用域不重合,一定不会引发名称冲突,因此只需测试在同名局部变量声明后的代码块中使用 using
编译指令的效果。测试程序如下:(运行成功)
#include <iostream>
//自定义名称空间
namespace Jack {
double pail = 1;
}
//测试
int main()
{
using namespace std;
//同名局部变量
double pail = 2;
//在同名局部变量声明后的代码块中使用
using namespace Jack;
//使用
cout << pail << endl; //结果为2
co