c++ using编译指令和using声明的使用和区别

616 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路


c++可以通过定义一种新的声明区域来创建命名的名称空间,例如

namespace boss{
	int number;
	int salary;
}
namespace employee{
	int number;
	int salary;
}

而使用时就需要通过域解析符::来限定名称空间

boss::number=2;
employee::salary=3000;

除此之外,还可以使用using声明和using编译指令来导入变量

1.using声明

using声明使得特定的标识符可用,如

using boss::number;
namespace boss{
	int number;
	int salary;
}
int number;
int main(){
	using boss::number;
	number=1;//boss::number=1;
	::number=20;//全局变量number=20
	return 0;
}

2.using编译指令

using编译指令使整个命名空间可用,如

using namespace boss;
namespace boss{
	int number;
	int salary;
}
int number;
int main(){
	using namespace boss;
	number=1;//boss::number=1;
	::number=20;//全局变量number=20
	return 0;
}

3.using编译指令和using声明的比较

using编译指令类似一次导入了命名空间的所有变量,而using声明一次只能导入一个空间的变量

使用using声明好像在代码块中声明了相应变量,因此在代码中就不能定义和此变量相同名称的变量,而使用using编译指令可以在代码块中定义相同名字的变量,此时存在于命名空间的同名变量会类似全局变量一样被隐藏,需要使用域解析符来使用。如:

namespace boss{
	int number;
	int salary;
}
int number;
int main(){
	using boss::number;
	int number;//错误,已经有一个boss::number变量
	number=1;//boss::number=1;
	::number=20;//全局变量number=20
	return 0;
}
namespace boss{
	int number;
	int salary;
}
int number;
int main(){
	using namespace boss;
	int number;//正确,boss::number被隐藏
	number=1;//本地变量number=1;
	boss::number=2;//boss::number=2
	::number=20;//全局变量number=20
	return 0;
}

因此,using声明比using编译指令更加安全,因为使用using声明导入的变量,如果有局部变量名称与其冲突,编译就会出错,而如果是using编译指令,局部变量与命名空间的变量名冲突,编译器就不会发出警告,从而导致使用错误变量的隐患。

另外,即使在同一个文件内部,创建命名空间,在使用时也需要使用域解析符,或者using语句来导入变量。即

namespace boss{
	int number;
	int salary;
}
int main(){
	number=1;//错误,number没有声明
	boss::number=1;//正确
	return 0;
}

对于名称空间,可以创建未命名的名称空间,如

namespace{
	int count;
}

由于此类名称空间没有名称,也就不能使用using语句来导入变量,或者说不能在名称空间所在文件之外的其他文件中使用该名称空间里的变量。名称空间的这种特性,提供了实现链接性为内部的静态变量的替代品。如内部链接的静态变量count

static int count;
int main(){
	count=0;
	return0;
}

也可以这样进行定义和使用,以达到同样的效果

namespace{
	int count;
}
int main(){
	count=0;//未命名名称空间中的变量在所属文件中直接使用。
	return0;
}