C++中的命名/名字/名稱空間 namespace
- 1、問題引入
- 2、概念
- 3、作用
- 4、格式
- 5、使用命名空間中的成員
- 5.1 using編譯指令( 引進整個命名空間) ---將這個盒子全部打開
- 5.2 using聲明使特定的標識符可用(引進命名空間的某個成員) ---將這個盒子中某個成員的位置打開
- 5.3 調用的時候指定是哪一個命名空間下的成員
- 6、示例代碼
- 7、命名空間的嵌套
- 8、同名命名空間
- 9、匿名命名空間
- 10、全局作用域
1、問題引入
\quad 探討:在實際的系統開發中,所有的開發工作,通常都不會僅由一個人來開發完成,不同的人只負責自己功能模塊,他們在設計時,比如聲明變量,通常情況下,不會考慮其他人是否已使用該變量名,在模塊功能測試時,相互之間是獨立的,完全沒有問題,當系統功能合成 時,不可避免地會出現變量或函數的命名沖突,因為變量或函數重名而導致的問題將會造成一定的混亂。所以如何在同一個.cpp文件中定義相同變量名的兩個全局變量呢
#include<iostream>int val = 200;
int val = 300;int main()
{return 0;
}
現象:編譯會報錯
解決方法:使用命名空間區分這兩個全局變量
2、概念
其實命名空間就是類似一個黑盒子
3、作用
防止名字沖突
4、格式
namespace 命名空間名字
{//聲明定義變量//聲明定義函數//定義結構體/共用體/枚舉 數據類型//聲明類 定義對象
}
5、使用命名空間中的成員
5.1 using編譯指令( 引進整個命名空間) —將這個盒子全部打開
using namespace 命名空間名字;
5.2 using聲明使特定的標識符可用(引進命名空間的某個成員) —將這個盒子中某個成員的位置打開
using 命名空間名字::成員名;
5.3 調用的時候指定是哪一個命名空間下的成員
cout<<命名空間名字::成員名
6、示例代碼
#include<iostream>using namespace std;//使用名稱空間LcdSpace
namespace LcdSpace{int x = 10;int y = 20;typedef struct{int data;}Data_t;enum {LCD_COLOR_RED,LCD_COLOR_GREEN};int lcd_init(){return 0;}};
//使用名稱空間TouchSpace
namespace TouchSpace{int x = 100;int y = 200;
};//外部的全局變量
//int x = 1000;
//int y = 2000;//2)使用using聲明的方式去引入名字空間中的某個成員
//把這個TouchSpace黑盒子 打開一個角落,正好把某個成員放出來
//格式:using 命名空間名字::成員名;
//using TouchSpace::x;void test01()
{using namespace LcdSpace;cout<<"x:"<<x<<" y:"<<y<<endl;
}int main()
{//3)使用using編譯指令的方式 打開整個名字空間 using namespace TouchSpace;//如何使用名字空間里面的成員//1)使用 作用域限定符:: 去指定//格式: 名字空間的名字::成員變量名std::cout<<TouchSpace::x<<" "<<TouchSpace::y<<std::endl;std::cout<<x<<" "<<y<<std::endl;std::cout<<LcdSpace::x<<" "<<LcdSpace::y<<std::endl;LcdSpace::Data_t data;LcdSpace::lcd_init();//我們有時候為了強調該變量的全局特性,可以在前面加上::修飾cout<<x<<" "<<y<<endl;test01();return 0;
}
7、命名空間的嵌套
namespace myspace{int x=10;int y=20;namespace spaceA{int a=100;void setValue(int data){a = data;}void printValue(){std::cout<<"a:"<<a<<std::endl;}}
}
使用:
myspace::spaceA::printValue();
8、同名命名空間
\quad 命名空間可以分開定義,也就是說,你在定義一個命名空間之后,如果后面想要在這個命名空間里面再次添加某些數據成員或者函數成員,可以再次接著定義。
namespace myspace{int x=10;int y=20;
}
namespace myspace{int a=100;int b=200;void print(){std::cout<<"x:"<<x<<" y:"<<y<<std::endl;}
}
9、匿名命名空間
namespace {int data=123;
}
可以在本文件中直接使用data, 限制空間中的成員只能在本文件中使用,類似c語言中的static修飾
10、全局作用域
\quad 全局作用域是從C語言就開始有的一種作用域,在C++中,有時為了強調某符號的全局特性,或為了避免與導入的名字空間中的重名符號沖突,會在使用全局符號的時候加上 作用域解析符
int global = 100;
int main()
{int global = 200;// 重名的標識符,外層的作用域會被內層的掩蓋cout << global << endl; // 輸出200// 使用雙冒號引用全局作用域中的標識符cout << ::global << endl; // 輸出100
}
- 全局作用域的名字空間是匿名的,引用全局作用域符號只需加 :: 即可。
- 名字空間的本質就是作用域,遵守C語言關于作用域的基本原則,如內層作用域重名符號會掩蓋外層作用域的重名符號。