[C++] namespace命名空間和using用法


命名空間namespace:指標識符的各種可見范圍。

C++標准程序庫中的所有標識符都被定義在一個std的namespace,這就是程序開始添加 using namespace std; 的原因。

很多人共同完成一套代碼,不可能不出現標識符命名相同的問題,為了解決沖突問題,產生了命名空間namespace。

 

命名空間包括又名命名空間和無名命名空間

 

一、有名命名空間

有名命名空間的定義格式:

namespace 空間名 {
    code
}

// 有名命名空間的嵌套定義
namespace 空間名1 {
    code
    namespace 空間名2 {
        code
    }
}

 

有名命名空間的使用格式:

// 直接使用"::"連接空間名和code
空間名:: code;    // code為變量或函數

 

有名命名空間取別名為了方便使用,定義格式如下:

namespace 別名 = 空間名;

 

using 指令使用格式:

// 表示后面代碼都使用此命名空間,如果屬空於本空間,無需再使用"::"連接空間名和code
using namespace 空間名; // 空間名支持嵌套

//最常用的std空間
using namespace std;

 

舉例:

#include <iostream>
// 使用std命名空間下的變量
using namespace std;

int a = 5;

namespace A {
    int a = 10;

    // 命名空間支持嵌套定義
    namespace B {
        int a = 15;
        int b = 20;
    }

    // 命名空間可以重復定義,相當於擴充
    namespace B {
        int x = 30;
        int y = 35;
    }
}

namespace C {
    int a = 25;
    // 錯誤,命名空間不能嵌套聲明
//    namespace D;
}

int main(void)
{
    // 如果不寫using namespace std,就必須加前綴std::
    std::cout << "Hello World!" << std::endl;
    cout << endl;    // 換行

    cout << "a = " << a << endl;
    cout << "A::a = " << A::a << endl;
    cout << "A::B::a = " << A::B::a << endl;
    cout << "C::a = " << C::a << endl;

    // 錯誤,提示變量b沒有聲明
//    cout << "b = " << b << endl;

    cout << endl;

    // 命名空間取別名
    namespace AB = A::B;
    cout << "AB = A::B" << endl;
    cout << "AB::a = " << AB::a << endl;
    cout << "AB::b = " << AB::b << endl;

    cout << endl;

    // 后面的代碼使用A::B命名空間下的變量
    using namespace A::B;
    cout << "使用A::B命名空間" << endl;
    cout << "b = " << b << endl;
    cout << "x = " << x << endl;
    cout << "y = " << y << endl;

    return 0;
}

執行結果:

 

二、無名命名空間

命名空間不僅可以避免名稱沖突,還可以是代碼保持局部性,從而保護代碼不被他人非法使用。

在當前的編譯單元直接使用無名命名空間中的成員,但是在當前編譯單元之外,它是不可見的

 

無名命名空間定義格式:

namespace {
    code
}

 

舉例:

#include <iostream>
// 使用std命名空間下的變量
using namespace std;

// 如果定義與無名命名空間相同,則會產生沖突報錯
//int a = 5;

namespace {
    int a = 10;
    int b = 20;

    namespace B {
        int a = 30;
        int b = 40;
    }

    int add(int a, int b)
    {
        return (a + b);
    }
}

int main(void)
{
    // 默認使用無名命名空間中的變量和空間
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "B::a = " << B::a << endl;
    cout << "B::b = " << B::b << endl;

    cout << endl;

    cout << "a + b = " << add(a, b) << endl;
    cout << "B::a + B::b = " << add(B::a, B::b) << endl;
 
    return 0;
}

執行結果:

 

總結:

1、命名空間可以嵌套定義,但不能嵌套聲明;

2、可以多次聲明和定義同一命名空間,相當於擴充,並添加新成員;

3、無名命名空間中的成員不能與同一文件中外部的成員相同;

4、無名命名空間中的成員使用方式與全局變量使用方式相同。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM