命名空間解決標識符衝突,提供作用域隔離。定義於全局或嵌套命名空間中,不可在函數/類內部定義。
變量、常量、函數、類/結構體/聯合體/枚舉、嵌套命名空間
namespace_name::member_name
namespace Outer {
int x = 1;
namespace Inner {
int y = 2;
}
}
// 訪問:Outer::Inner::y
namespace V98 { void f(int); }
inline namespace V99 { // 默認版本
void f(int);
void f(double); // 新功能
}
namespace Mine {
#include "V99.hpp"
#include "V98.hpp"
}
// 使用:Mine::f(1) → 調用V99版本
// 顯式指定:Mine::V98::f(1)
用於版本管理,`inline`指示符由庫作者放置指示默認版本。
隱式存在,`::member`訪問全局實體。
namespace {
int count = 1; // 僅本文件可見
void func() { ... }
}
// 直接使用 count, func()
// 替代 static 全局變量/函數
// 可用於類/結構體定義(static不能修飾類)
特性:文件級隔離,不跨文件,程序啟動創建,結束銷毀。
namespace MyNames { int a=1, b=2; }
namespace Alias = MyNames; // 別名
Alias::a; // 等價於 MyNames::a
| 特性 | using聲明 | using指示 |
|---|---|---|
| 語法 | `using ns::name;` | `using namespace ns;` |
| 作用 | 引入單一名稱 | 引入整個命名空間 |
| 作用域 | 從聲明點到作用域末尾 | 同左 |
| 可出現位置 | 全局/局部/類/命名空間 | 全局/局部/命名空間(不可類內) |
| 名稱衝突 | 易發現(編譯錯誤) | 隱性污染全局命名空間 |
優先使用using聲明,避免using指示導致的命名污染和難以排查的二義性。
// mynames.hpp
namespace MyNames {
extern int iVal;
class MyString { ... };
void NormalFunc();
struct st_Names { ... };
union un_Names { ... };
enum en_Names { ZERO, ONE, TWO };
}
// mynames.cpp
namespace MyNames {
int iVal = 100;
// 實現成員...
}
// example.cpp
#include "mynames.hpp"
namespace Name = MyNames; // 別名
using namespace Name; // 引入
int main() {
cout << iVal << endl; // 直接用
cout << Name::iVal << endl; // 別名用
cout << MyNames::iVal << endl; // 完整限定
MyNames::MyString s("Hello");
s.OutputString();
MyNames::NormalFunc();
return 0;
}