C++ 項目相關(guān)知識命名空間

命名空間

命名空間一般是對全局變量,函數(shù),類做處理的,以防多個重名變量引起的重定義錯誤。命名空間主要分為三種

  1. 你指定的命名空間
namespace A{
        char c;
        int i;
        double d;
}

你指定了一個名字為A的命名空間。這種命名空間具有外部鏈接屬性,也就是說這個空間里的變量和函數(shù)會和其他文件同一名字的命名空間一起鏈接。
在同一個項目里,test1.cpp的內(nèi)容為

namespace A {
    int a;//默認是外部屬性external
}

把main.cpp內(nèi)容為

#include"test1.cpp"
int main(){
}

編譯鏈接的時候就會報錯

CMakeFiles/joinordetach.dir/test1.cpp.o:test1.cpp:(.bss+0x0): multiple definition of `A::a'
CMakeFiles/joinordetach.dir/main.cpp.o:main.cpp:(.bss+0x0): first defined here

重定義錯誤,因為在同一個命名空間里有多個同名變量分配了不同空間地址,a在test1.cpp里分配了空間,也在main.cpp里分配了空間。鏈接器不知道哪個空間才是該變量的正確地址。
所以不能在多個文件的同一個命名空間里定義同名變量,只能在其中一個文件定義,而別的文件里聲明引用,對這兩個文件進行如下修改
test1.cpp內(nèi)容改成

#include <iostream>

namespace A {//定義了一個命名空間
    extern int a;//聲明了a,默認是外部屬性external
    void fun();/聲明了fun(),/默認是外部屬性external
}

main.cpp內(nèi)容改成

#include<iostream>
#include "test1.cpp"
int A::a=3;//定義a
void A::fun()//定義函數(shù)fun
{
    std::cout << "hello world" << std::endl;
}
int main() {
    std::cout << A::a << std::endl;//使用命名空間A里的a
    A::fun();//使用命名空間A里的fun
}

結(jié)果是

3
hello world

使用另外一個cpp里命名空間里的變量的方法
test1.cpp里內(nèi)容如下

namespace  A{
    int a=5;
}

main.cpp里內(nèi)容如下

#include <iostream>
namespace A{
    extern int a;
}
int main()
{
    std::cout<<A::a<<std::endl;
}

輸出結(jié)果為

5
  1. 如果你不加指定,則默認使用全局命名空間,在同一個項目里,多個文件要是都沒指定命名空間,則這一個項目使用默認的全局命名空間,全局命名空間里的變量和函數(shù)都是外部鏈接屬性,即可以被另一個文件引用,注意這里的變量和函數(shù)都是全局的,而非局部作用域里的變量(比如main函數(shù)里的變量)。
    在同一個項目里有兩個文件,一個"test.cpp"
#include <iostream>
int a=10;//默認是外部屬性external
void fun()//默認是外部屬性external
{
    std::cout<<"hello world"<<std::endl;
}

另一個"main.cpp"

# include<iostream>

using namespace std;
extern  int a;//聲明a在別的地方定義了
extern void fun();//聲明函數(shù)fun在別的地方定義了
int main()
{
    cout<<a<<endl;//使用a
    fun();
}

運行結(jié)果如下

10
hello world
  1. 匿名空間
# include<iostream>

namespace {
    char c;
    int i=3;
    double d;
}
int main()
{
    std::cout<<i<<std::endl;
}

輸出結(jié)果

3

你可以省略命名空間的名字,則該空間的所有變量只能被當前文件所引用,而不能被同一個項目里別的文件使用。這些變量具有internal鏈接屬性,這和聲明為static的全局名稱的鏈接屬性是相同的,即名稱的作用域被限制在當前文件中,無法通過在另外的文件中使用extern聲明來進行鏈接。命名空間都是具有external 連接屬性的,只是匿名的命名空間產(chǎn)生的UNIQUE_NAME在別的文件中無法得到,這個唯一的名字是不可見的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一關(guān)結(jié)束后,懷著惴惴不安又充滿期待的心情我進入到了第二關(guān)。為什么說是惴惴不安呢?因為在上一關(guān)我常陷入緊張、...
    葉子qx閱讀 299評論 0 0
  • “你要學會放過你自己,你以為的尷尬或者丟人的事都只是你以為,這個世界并不會有太多的人記住你的這些事”。
    冷欲秋閱讀 533評論 0 0
  • 八聲甘州 · 立冬寄懷 又林岑曠莽氣弘新。萬里競無塵。正霜痕方結(jié),冰花乍白,軟雪初紛。近岸菊殘柳寂,一水尚粼粼。羽...
    草齋風涼閱讀 363評論 0 0
  • 我一直相信“近朱者赤”這一結(jié) 和優(yōu)秀的人一一起不管生活還是精神上或多或少是有點改變的,和優(yōu)秀的人在一起你會向他們看...
    冰荷之瑤閱讀 779評論 0 0

友情鏈接更多精彩內(nèi)容