使用无名命名空间可以替代文件中的静态声明。在文件中进行静态声明的做法已经被C++标准取消,推荐的做法是使用无名命名空间。
将文件中的变量和函数声明为静态声明,可将其作用域限定为该文件范围有效,避免与其它文件的同名变量或函数冲突。在C++引入无名命名空间后,在文件中使用无名命名空间来定义变量和函数,也能起到与静态声明一样的效果,而且不需要每个变量和函数单独加static进行声明。
三、注意事项
1、如果两个源文件都含有无名命名空间,这两个无名命名空间可以定义相同名字的成员,因为这两个空间没有关联,各自空间的成员作用域也仅限于各自文件中。
2、无名命名空间的成员名称不能与全局作用域的成员名称相同,会导致二义性。
#include <iostream>
using namespace std;
int a = 10;
namespace {
int a = 10; //错误,会与全局数据区的a冲突
int get(void)
return 20;
int main(void){
cout<<"a: "<<a<<endl; //二义性,不知访问哪个a,编译报错
cout<<"get(): "<<get()<<endl;
return 0;
3、与所有命名空间类似,一个无名命名空间也能嵌套在其它命名空间中。此时,无名命名空间的成员可以通过上一层命名空间的名字来访问。
#include <iostream>
using namespace std;
namespace local{
namespace {
int a = 10;
int get(void)
return 20;
int main(void){
cout<<"a: "<<local::a<<endl;
cout<<"get(): "<<local::get()<<endl;
return 0;
4、一个源文件可以定义多个无名命名空间,但是这些空间内的成员名称不能相同,否则会导致二义性。
#include <iostream>
using namespace std;
namespace {
int a = 10;
int get(void)
return 20;
namespace {
int a = 13; //错误,会与前面空间的a冲突,编译报错
int b = 18;
int getb(void)
return 28;
int main(void){
cout<<"a: "<<a<<endl;
cout<<"get(): "<<get()<<endl;
cout<<"b: "<<b<<endl;
cout<<"getb(): "<<getb()<<endl;
return 0;
参考文献:
《C++ Primer中文版》
一、定义定义:无名命名空间,又称为未命名的命名空间。是指关键字namespace后紧跟花括号括起来的一系列声明语句,不需要对命名空间取名。eg:namespace { int a = 10; int get(void) { return 20; }}生命周期:无名命名空间中定义的变量拥有同静态变量一样的生命周期,在第一次使用前创建,直到程序结束才销毁。作用域:无名命名空间中定义的成员的作用域与该命名空间所在的作用域相
在今天看一些源码的时候,无意间发现了 namespace {inline int getValue(int); }类似与这样的用法,虽然学习了这么久的c++,但是真的还是第一次看见
然后就在网上查了下关于namespace {}的用法。
无名命名空间允许无限定的使用其成员函数,并且为它提供了内部连接(只有在定义的文件内可以使用)
命名控件不需要命名,它的成员不需要限定就可以使用。
在C/C++中,变量,函数和类都是大量存在的,这些变量,函数和类的名称将都存在于全局作用域中,可能会导致很多冲突;使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
1.命名空间的定义
定义命名空间,需要使用namespace关键字,后面加命名空间的名字,然后接一对{ }便可以了,{ }中为命名空间的成员。如下例所示:
(1...
C++命名空间namespace
文章目录C++命名空间namespacenamespace的基本概念namespace的要点和主函数同文件下的命名空间不和主函数同文件下的命名空间命名空间定义和声明写在一块命名空间定义和声明不写在一块含有自定义类型的命名空间和主函数同文件下不和主函数在同文件下的
namespace的基本概念
namespace被翻译过来是命名空间或者名称空间。namespace的主要作用是将代码区域化。在开发的过程中可能会存在命名相同的情况,这个时候如果使用了namespace将代码划分起
1. 变量名称应该描述变量的用途,如“count”,“sum”等。
2. 变量名称应该以小写字母开头,如果变量名称由多个单词组成,则每个单词的首字母应该大写,这种命名方式称为驼峰命名法。
3. 常量名称应该全部大写,单词间用下划线隔开,如“PI”,“MAX_LENGTH”。
4. 函数名称应该以小写字母开头,其余与变量名称相同。
5. 类型名称应该以大写字母开头,其余与变量名称相同,如“struct”,“enum”等。
这些约定并非必须遵循,但遵循它们可以帮助您编写更加整洁,易读,易维护的代码。