您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++標準庫和std命名空間是什么”,在日常操作中,相信很多人在C++標準庫和std命名空間是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++標準庫和std命名空間是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
C++ 是在C語言的基礎上開發的,早期的 C++ 還不完善,不支持命名空間,沒有自己的編譯器,而是將 C++ 代碼翻譯成C代碼,再通過C編譯器完成編譯。這個時候的 C++ 仍然在使用C語言的庫,stdio.h、stdlib.h、string.h 等頭文件依然有效;此外 C++ 也開發了一些新的庫,增加了自己的頭文件,例如:
iostream.h:用于控制臺輸入輸出頭文件。
fstream.h:用于文件操作的頭文件。
complex.h:用于復數計算的頭文件。
和C語言一樣,C++ 頭文件仍然以.h
為后綴,它們所包含的類、函數、宏等都是全局范圍的。
后來 C++ 引入了命名空間的概念,計劃重新編寫庫,將類、函數、宏等都統一納入一個命名空間,這個命名空間的名字就是std
。std 是 standard 的縮寫,意思是“標準命名空間”。
但是這時已經有很多用老式 C++ 開發的程序了,它們的代碼中并沒有使用命名空間,直接修改原來的庫會帶來一個很嚴重的后果:程序員會因為不愿花費大量時間修改老式代碼而極力反抗,拒絕使用新標準的 C++ 代碼。
C++ 開發人員想了一個好辦法,保留原來的庫和頭文件,它們在 C++ 中可以繼續使用,然后再把原來的庫復制一份,在此基礎上稍加修改,把類、函數、宏等納入命名空間 std 下,就成了新版 C++ 標準庫。這樣共存在了兩份功能相似的庫,使用了老式 C++ 的程序可以繼續使用原來的庫,新開發的程序可以使用新版的 C++ 庫。
為了避免頭文件重名,新版 C++ 庫也對頭文件的命名做了調整,去掉了后綴.h
,所以老式 C++ 的iostream.h
變成了iostream
,fstream.h
變成了fstream
。而對于原來C語言的頭文件,也采用同樣的方法,但在每個名字前還要添加一個c
字母,所以C語言的stdio.h
變成了cstdio
,stdlib.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 <cstdio>
這種形式,那么符號可以位于命名空間 std 中,也可以位于全局范圍中,請看下面的兩段代碼。
1) 使用命名空間 std:
#include <cstdio>int main(){std::printf("http://c.biancheng.net\n");return 0;}
2) 不使用命名空間 std:
#include <cstdio>int main(){printf("http://c.biancheng.net\n");return 0;}
這兩種形式在 Microsoft Visual C++ 和 GCC 下都能夠編譯通過,也就是說,大部分編譯器在實現時并沒有嚴格遵循標準,它們對兩種寫法都支持,程序員可以使用 std 也可以不使用。
第 1) 種寫法是標準的,第 2) 種不標準,雖然它們在目前的編譯器中都沒有錯誤,但我依然推薦使用第 1) 種寫法,因為標準寫法會一直被編譯器支持,非標準寫法可能會在以后的升級版本中不再支持。
雖然 C++ 幾乎完全兼容C語言,C語言的頭文件在 C++ 中依然被支持,但 C++ 新增的庫更加強大和靈活,請讀者盡量使用這些 C++ 新增的頭文件,例如 iostream、fstream、string 等。
前面幾節我們使用了C語言的格式輸出函數 printf,引入了C語言的頭文件 stdio.h,將C代碼和 C++ 代碼混合在了一起,我不推薦這樣做,請盡量使用 C++ 的方式。下面的例子演示了如何使用 C++ 庫進行輸入輸出:
#include <iostream>#include <string>int main(){//聲明命名空間stdusing namespace std;//定義字符串變量string str;//定義 int 變量int age;//從控制臺獲取用戶輸入cin>>str>>age;//將數據輸出到控制臺cout<<str<<"已經成立"<<age<<"年了!"<<endl;return 0;}
運行結果:
C語言中文網↙
4↙
C語言中文網已經成立4年了!
string 是 C++ 中的字符串類,初學者可以將 string 看做一種內置的數據類型,就像 int、float 等,可以用來定義變量。cin 用于從控制臺獲取用戶輸入,cout 用于將數據輸出到控制臺,下節我們會詳細講解。
讀者暫時不需要深入了解這段代碼的細節,只需要留意using namespace std;
,它聲明了命名空間 std,后續如果有未指定命名空間的符號,那么默認使用 std,代碼中的 string、cin、cout 都位于命名空間 std。
在 main() 函數中聲明命名空間 std,它的作用范圍就位于 main() 函數內部,如果在其他函數中又用到了 std,就需要重新聲明,請看下面的例子:
#include <iostream>void func(){//必須重新聲明using namespace std;cout<<"http://c.biancheng.net"<<endl;}int main(){//聲明命名空間stdusing namespace std;cout<<"C語言中文網"<<endl;func();return 0;}
如果希望在所有函數中都使用命名空間 std,可以將它聲明在全局范圍中,例如:
#include <iostream>//聲明命名空間stdusing namespace std;void func(){cout<<"http://c.biancheng.net"<<endl;}int main(){cout<<"C語言中文網"<<endl;func();return 0;}
到此,關于“C++標準庫和std命名空間是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。