extent static const
??extern:這就是告訴編譯器,這個變量或函數在別的編譯單元里定義了,也就是要把這個符號放到未解決符號表里面去(外部鏈接)。
?? ??static:如果該關鍵字位于全局函數或者變量的聲明前面,表明該編譯單元不導出這個函數或變量,因些這個符號不能在別的編譯單元中使用(內部鏈接)。如果是static局部變量,則該變量的存儲方式和全局變量一樣,但是仍然不導出符號。?
?? ??默認鏈接屬性:對于函數和變量,默認鏈接是外部鏈接,對于const變量,默認內部鏈接。
?? ??外部鏈接的利弊:外部鏈接的符號在整個程序范圍內都是可以使用的,這就要求其他編譯單元不能導出相同的符號(不然就會報
duplicated external symbols)。
?? ??內部鏈接的利弊:內部鏈接的符號不能在別的編譯單元中使用。但不同的編譯單元可以擁有同樣的名稱的符號。
?? ??為什么頭文件里一般只可以有聲明不能有定義:頭文件可以被多個編譯單元包含,如果頭文件里面有定義的話,那么每個包含這頭文件的編譯單元都會對同一個符號進行定義,如果該符號為外部鏈接,則會導致duplicated external symbols鏈接錯誤。?
?? ??為什么公共使用的內聯函數要定義于頭文件里:因為編譯時編譯單元之間互不知道,如果內聯被定義于.cpp文件中,編譯其他使用該函數的編譯單元的時候沒有辦法找到函數的定義,因些無法對函數進行展開。所以如果內聯函數定義于.cpp里,那么就只有這個.cpp文件能使用它。
對于函數和變量,默認的是外部鏈接,但是如果是const 變量,則是內部鏈接。const和static就是把變量變為內部變量,外部不可以用。但是extent const變量,外部可以用,但是不能修改。
例如:
在t.cpp的定義如下:
int at = 7;
const int c = 9;
extern const int bt = 3;
在main.cpp
extern int at;//全局變量都是外部變量,其他編譯單元只要加extern就可以引用。所以extern的作用就是,這個變量不是在本編譯單元定義的
extern void f();//和全局變量一樣
int bt = 8;//
int main() {
cout<<at<<endl;
?? f();
?
?? cout<<d<<endl;
?? ?return 0;?
}
總結
以上是生活随笔為你收集整理的extent static const的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大端 小端
- 下一篇: hash和trie的对比