C 標頭檔案和std命名空間

2021-09-29 10:06:36 字數 3031 閱讀 6465

c++ 是在c語言的基礎上開發的,早期的 c++ 還不完善,不支援命名空間,沒有自己的編譯器,而是將 c++ **翻譯成c**,再通過c編譯器完成編譯。這個時候的 c++ 仍然在使用c語言的庫,stdio.h、stdlib.h、string.h 等標頭檔案依然有效;此外 c++ 也開發了一些新的庫,增加了自己的標頭檔案,例如:

和c語言一樣,c++ 標頭檔案仍然以.h為字尾,它們所包含的類、函式、巨集等都是全域性範圍的。

後來 c++ 引入了命名空間的概念,計畫重新編寫庫,將類、函式、巨集等都統一納入乙個命名空間,這個命名空間的名字就是std。std 是 standard 的縮寫,意思是「標準命名空間」。

但是這時已經有很多用老式 c++ 開發的程式了,它們的**中並沒有使用命名空間,直接修改原來的庫會帶來乙個很嚴重的後果:程式設計師會因為不願花費大量時間修改老式**而極力反抗,拒絕使用新標準的 c++ **。

c++ 開發人員想了乙個好辦法,保留原來的庫和標頭檔案,它們在 c++ 中可以繼續使用,然後再把原來的庫複製乙份,在此基礎上稍加修改,把類、函式、巨集等納入命名空間 std 下,就成了新版 c++ 標準庫。這樣共存在了兩份功能相似的庫,使用了老式 c++ 的程式可以繼續使用原來的庫,新開發的程式可以使用新版的 c++ 庫。

為了避免標頭檔案重名,新版 c++ 庫也對頭檔案的命名做了調整,去掉了字尾.h,所以老式 c++ 的iostream.h變成了iostreamfstream.h變成了fstream。而對於原來c語言的標頭檔案,也採用同樣的方法,但在每個名字前還要新增乙個c字母,所以c語言的stdio.h變成了cstdiostdlib.h變成了cstdlib

需要注意的是,舊的 c++ 標頭檔案是官方所反對使用的,已明確提出不再支援,但舊的c標頭檔案仍然可以使用,以保持對c的相容性。實際上,編譯器開發商不會停止對客戶現有軟體提供支援,可以預計,舊的 c++ 標頭檔案在未來數年內還是會被支援。

下面是 c++ 標頭檔案的現狀:

1) 舊的 c++ 標頭檔案,如 iostream.h、fstream.h 等將會繼續被支援,儘管它們不在官方標準中。這些標頭檔案的內容不在命名空間 std 中。

2) 新的 c++ 標頭檔案,如 iostream、fstream 等包含的基本功能和對應的舊版標頭檔案相似,但標頭檔案的內容在命名空間 std 中。

注意:在標準化的過程中,庫中有些部分的細節被修改了,所以舊的標頭檔案和新的標頭檔案不一定完全對應。

3) 標準c標頭檔案如 stdio.h、stdlib.h 等繼續被支援。標頭檔案的內容不在 std 中。

4) 具有c庫功能的新c++標頭檔案具有如 cstdio、cstdlib 這樣的名字。它們提供的內容和相應的舊的c標頭檔案相同,只是內容在 std 中。

可以發現,對於不帶.h的標頭檔案,所有的符號都位於命名空間 std 中,使用時需要宣告命名空間 std;對於帶.h的標頭檔案,沒有使用任何命名空間,所有符號都位於全域性作用域。這也是 c++ 標準所規定的。

不過現實情況和 c++ 標準所期望的有些不同,對於原來c語言的標頭檔案,即使按照 c++ 的方式來使用,即#include這種形式,那麼符號可以位於命名空間 std 中,也可以位於全域性範圍中,請看下面的兩段**。

1) 使用命名空間 std:

#include int main()
2) 不使用命名空間 std:

#include int main()
這兩種形式在 microsoft visual c++ 和 gcc 下都能夠編譯通過,也就是說,大部分編譯器在實現時並沒有嚴格遵循c++標準,它們對兩種寫法都支援,程式設計師可以使用 std 也可以不使用。

第 1) 種寫法是標準的,第 2) 種不標準,雖然它們在目前的編譯器中都沒有錯誤,但我依然推薦使用第 1) 種寫法,因為標準寫法會一直被編譯器支援,非標準寫法可能會在以後的公升級版本中不再支援。

雖然 c++ 幾乎完全相容c語言,c語言的標頭檔案在 c++ 中依然被支援,但 c++ 新增的庫更加強大和靈活,請讀者盡量使用這些 c++ 新增的標頭檔案,例如 iostream、fstream、string 等。

使用了c語言的格式輸出函式 printf,引入了c語言的標頭檔案 stdio.h,將c**和 c++ **混合在了一起,不推薦這樣做,請盡量使用 c++ 的方式。下面的例子演示了如何使用 c++ 庫進行輸入輸出:

#include #include int main(){

//宣告命名空間std

using namespace std;

//定義字串變數

string str;

//定義 int 變數

int age;

//從控制台獲取使用者輸入

cin>>str>>age;

//將資料輸出到控制台

cout暫時不需要深入了解這段**的細節,只需要留意using namespace std;,它宣告了命名空間 std,後續如果有未指定命名空間的符號,那麼預設使用 std,**中的 string、cin、cout 都位於命名空間 std。

在 main() 函式中宣告命名空間 std,它的作用範圍就位於 main() 函式內部,如果在其他函式中又用到了 std,就需要重新宣告,請看下面的例子:

#include void func(){

//必須重新宣告

using namespace std;

cout<<"11111"《如果希望在所有函式中都使用命名空間 std,可以將它宣告在全域性範圍中,例如:

#include //宣告命名空間std

using namespace std;

void func(){

cout<<"11111"《很多教程中都是這樣做的,將 std 直接宣告在所有函式外部,這樣雖然使用方便,但在中大型專案開發中是不被推薦的,這樣做增加了命名衝突的風險,推薦在函式內部宣告 std。

std空間和全域性命名空間

參考資料 注意不要盲目相信以下內容!不要盲目相信以下內容!在c 中,我們常用的標頭檔案為不帶 h 字尾的標頭檔案,而這些標頭檔案裡所包含和定義的識別符號在std空間中,所以我們使用c 時經常需要加上 using namespace std 而原c語言的標頭檔案為帶 h 字尾的標頭檔案,這些標頭檔案裡...

C 命名空間與std

本文參考 1.命名空間是啥 舉個栗子,班上有學生 張三 李三 王三 如果你大吼一聲 三兒 肯定三個人一起懵圈地看著你,為了避免這麼尷尬的情況發生,機智的中國人發明了 姓氏 你先去張家族,再喊 三兒 那大家都知道是張三了。同理,調取乙個變數a,就相當於喊了一聲 三兒 為了避免誤會,你得給他加個姓氏,也...

C 標準命名空間std

輸入輸出要用到這個.標準c 庫的所有的識別符號都是在乙個名為std的命名空間中定義的,或者說標準標頭檔案 如iostream 中函式 類 物件和類模板是在命名空間 std中定義的。std是standard 標準 的縮寫,表示這是存放標準庫的有關內容的命名空間。二元作用域分辨運算子 using std...