C++標準庫和std命名空間

2021-03-02 C語言三人行+

標準C語言(ANSI C)共定義了 15 個頭文件,稱為「C標準庫」,所有的編譯器都必須支持,它們包括:

頭文件說明stdio.h定義了用於輸入和輸出的函數、類型和宏。stdlib.h包含了C語言的中最常用的系統函數。string.h包含了C語言的最常用的字符串操作函數。ctype.h主要提供兩類重要的函數:字符測試函數和字符大小轉化函數。assert.h提供C語言斷言功能,唯一的目的是提供宏assert的定義。limits.h指明了基本數據類型的取值範圍。stddef.h定義了一些標準定義,許多定義也會出現在其他的頭文件裡。time.h獲取時間與日期,對時間與日期數據操作及格式化的頭文件。float.h定義了浮點型數值的最大最小限。math.h定義了與數學計算有關的函數。error.h錯誤處理。locale.h定義了本地化設置相關的函數。setjmp.h定義了一種特別的函數調用和函數返回順序的方式。signal.h提供了一些函數用以處理執行過程中所產生的信號。stdarg.h可變參數列表,定義了一些宏,當函數參數未知時去獲取函數的參數。你可以猛擊《C語言的發展及其版本》來了解 ANSI C。

早期的 C++ 還不完善,不支持命名空間,沒有自己的編譯器,而是將C++代碼翻譯成C代碼,再通過C編譯器編譯成目標代碼。

這個時候的C++仍然在使用C語言庫,此外還開發了一些新的庫,增加了不少頭文件,例如:

iostream.h:輸入輸出頭文件。

fstream.h:文件操作頭文件。

wchar.h:寬字符處理頭文件。


和C語言一樣,C++頭文件仍然以.h為後綴,其中的類、函數等都是全局範圍的。

C語言的庫定義了大量的函數、宏、自定義數據類型等,而C++新增的庫主要定了大量的類,它們非常豐富也非常強大,對很多常用的功能進行了封裝,例如鍊表、堆棧、樹等數據結構,你不需要再從頭寫代碼,會使用庫就可以。

學習C++,除了學習語法,還要熟悉常用的類,這兩個方面花的時間都不少。

後來C++引入了命名空間的概念,計劃重新編寫庫,將類、函數等都統一納入一個命名空間中(命名空間的名字是 std)。但是這時已經有很多用老式C++開發的程序了,它們的代碼中並沒有使用命名空間,直接修改原來的庫會帶來一個很嚴重的後果:程式設計師會因為不願花費大量時間修改老式代碼而極力反抗,拒絕使用新標準的C++代碼。

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

新版C++也對頭文件的命名做了調整,去掉了後綴.h,所以老式C++的 <iostream.h> 變成了 <iostream>,<fstream.h> 變成了 <fstream>。而對於原來C語言的頭文件,也採用同樣的方法,但在每個名字前還要添加一個c字母,所以C語言的 <string.h> 變成了 <cstring>,<stdio.h> 變成了 <cstdio>。

最後一點是,舊的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 中。

使用C++標準頭文件

前面幾節中我們使用了C語言的格式輸出函數 printf,引入了頭文件 stdio.h,這完全沒有錯誤,因為C++兼容C。但在C++代碼中我還是推薦使用C++的頭文件,不要把C和C++代碼混合在一起使用。

如果你希望使用 printf 函數,那麼應該引入 <cstdio>,並使用命名空間 std,如下所示:

#include <cstdio>

using namespace std;

C++ 將標準庫中的所有類、函數等都放到了命名空間 std,一般在文件開頭使用 using 關鍵字聲明。

<cstdio> 和 <stdio.h> 不是一個頭文件,如果查看原始碼你會發現它們並不一樣。

一個完整的示例:

#include <cstdio>

using namespace std;

class Book{

private:

float price;

public:

void setprice(float price1){

price = price1;

}

float getprice(){

return price;

}

};

int main(){

float price;

Book book;

scanf("%f", &price);

book.setprice(price);

printf("The price of the book is %f.\n", book.getprice());

return 0;

}

運行結果:
68.5↙
The price of the book is 68.500000.

相關焦點

  • C++之標準庫的學習總結
    二、c++標準庫:1、標準庫的特性:2、C++編譯環境的組成:std;//所謂命名空間,是一種將程序庫名稱封裝起來的方法,它就像在各個程序庫中立起一道道圍牆int main(){    printf("Hello world!
  • 學習c++筆記——標準輸出流cout
    前和往常一樣,一邊喝早茶,一邊上網和女粉絲侃大山,在手機和平板電腦上整理修改《html5》、《javascript》、《css3》、《c語言》等多年前寫的教程
  • 今日盤點C++和C的區別
    1983年該語言被正式命名為C++。自從C++被發明以來,它經歷了3次主要的修訂,每一次修訂都為C++增加了新的特徵並作了一些修改。第一次修訂是在1985年,第二次修訂是在1990年,而第三次修訂發生在c++的標準化過程中。
  • 跟我學C++中級篇——STL的學習
    一、c++標準庫C++的標準庫主要包含兩大類,首先是包含C的標準庫的,當然,為了適應c++對一些C庫進行了少許的修改和增加。最重要的當然是面向對象的c++庫;而c++庫又可以分成兩大類,即面向對象的c++庫和標準模板庫,也就是題目中的STL。
  • C++基礎總結(一):從「hello world」入門C++!
    C++ 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的程式語言,支持過程化編程、面向對象編程和泛型編程。C++ 被認為是一種中級語言,它綜合了高級語言和低級語言的特點。C++ 是由 Bjarne Stroustrup 於 1979 年在新澤西州美利山貝爾實驗室開始設計開發的。
  • C++命名空間namespace的理解
    C語言定義了3個層次的作用域:文件、函數和複合語句。C++ 引入了類的作用域,類是在文件內的。在不同的作用域中,可以定義相同名字的變量,互不幹擾,編譯器能夠區別它們。1、命名空間的概念C語言中,只有一個全局作用域,所有全局標識符共享一個作用域,因此絕對不能重名。但隨著系統越來越複雜,通常不會僅由一個人來開發,不同的人開發同一個系統,不可避免地會出現變量或函數的命名衝突,當將所有人的代碼結合到一起時,就會因為變量或函數重名,導致編譯失敗。
  • C++隨機排序容器中的元素
    作者:apocelipes連結:https://www.cnblogs.com/apocelipes/p/10351335.html在各種程序語言中都提供了將容器元素隨機排序的shuffle方法,c++
  • 小白入門:初識C++
    代碼如下:#include<iostream>#include<cstdlib>usingnamespacestd;intmain(){inti=10;while(i){cout<<i;--i;}system("pause");return0;}運行結果:10 9 8 7 6 5 4 3 2 1小貼士:由於在main函數前添加了
  • Apache基金會廢棄其C++標準庫
    Apache軟體基金會決定終止Apache C++標準庫項目——stdcxx項目。該庫並沒有像GCC的libstdc++庫甚至是LLVM的libc++庫那樣被廣泛使用,自從2005年開始,Apache就開始支持stdcxx標準庫的開發。在2008年中旬,Apache發布了最後一個版本stdcxx 4.2.1。
  • 《和孩子一起學C++》cout語句的使用
    #include <iostream>using namespace std;int main() {return 0;}一個C++程序由頭文件、命名空間和主函數構成。頭文件類似於這種形式:#include <iostream>,是C++對其他程序的引用,這樣就可以在我們的程序中調用引用程序中的功能(函數)。
  • C++系列2-1:C++快速入門之命名空間和輸入輸出
    命名空間可以有效的解決這個問題,使用命名空間目的在於將標識符的名稱本地化,以免衝突。簡單點來說,把名字關進「小黑屋」,你的和我的即便名字是一樣的,但是本質是不一樣的,使用時按照一定方式打開「小黑屋」(2)命名空間的定義A:命名空間的定義定義命名空間時,要使用namespace關鍵字,其後緊接該命名空間的名字,然後寫上「{}」,括號內即是該命名空間的成員。有點像結構體。
  • 跟我學C++中級篇——STL中的字符串
    STL為了解決這個問題,提供了std::string這個數據結構,其實它就是一個類,不過其提供了常見的對字符串的操作符的重載,實現在實際工程中經常遇到的字符串的長度計算,拼接和裁剪以及和C類型字符串的轉換。它不算是STL的容器,它只是一個類。
  • C++17新特性介紹:std::optional
    在這種情況下,我們可以嘗試一下C++17裡的新特性:std::optional。過時的解決辦法在前面描述的問題中,如果不採用std::optional,我們還是有辦法解決的。對於上面傳感器讀數的特定問題,我們的函數可以返回一個float的最大值FLT_MAX,當然,這就要求調用這個函數的程序特別處理這個特殊的返回值了。
  • c++簡介及順序結構
    c++介紹C++ 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的程式語言,支持過程化編程、面向對象編程和泛型編程。C++ 被認為是一種中級語言,它綜合了高級語言和低級語言的特點。C++ 進一步擴充和完善了 C 語言,最初命名為帶類的C,後來在 1983 年更名為 C++。C++ 是 C 的一個超集,事實上,任何合法的 C 程序都是合法的 C++ 程序。注意:使用靜態類型的程式語言是在編譯時執行類型檢查,而不是在運行時執行類型檢查。2. 開發環境2.1.
  • c++之內存分配、命名空間、強制類型轉換學習總結
    + 中的命名空間:在c語言中只有一個全局作用域:c語言中所有的全局標識符共享同一個作用域。-c++中提出了命名空間的概念:命名空間將全局作用域分成不同的部分。不同命名空間中的標識符可以同名而且不會發生衝突。
  • Effective C++條款13 C++基本功之智能指針
    智能指針簡介C++語言標準庫STL提供了一套智能指針接口,且一直處於完善狀態,如下圖所示:最早的智能指針是std::auto_ptr,到c++11才開始廣泛使用,平時用得最多的是這三個:使用unique_ptr和share_ptr目前智能指針主要使用unique_ptr和share_ptr,兩者的區別如下:std::shared_ptr 是一種智能指針,它能夠記錄多少個 shared_ptr 指向同一個對象,當引用計數變為零的時候對象會自動執行delete。
  • 走進C++11(三十七)原子操作之 std::atomic
    每個 std::atomic 模板的實例化和全特化定義一個原子類型。若一個線程寫入原子對象,同時另一線程從它讀取,則行為良好定義(數據競爭的細節我們會在下節--內存模型裡講解)另外,對原子對象的訪問可以建立線程間同步,並按 std::memory_order 所對非原子內存訪問定序。 需要注意的是,std::atomic 既不可複製亦不可移動。
  • C++機器學習庫介紹
    =c++11 -lboost_serialization -lshark -lcblas用Shark實現線性回歸初始化階段我們將從包含線性回歸的庫和頭函數開始:#include <bits/stdc++.h> //所有c++標準庫的頭文件#include <shark
  • C++之旅-string
    前言標準庫類型string表示可變長字符序列,使用之前需要包含string頭文件,它定義在命名空間std中。
  • C++ 優先隊列priority_queue
    如果類型 T 和 Container 容器中元素類型不一致,那麼行為未定義,所以要避免這種情況。2. Container 必須是序列容器,其實C++中序列容器很多的,比如std::array、std::vector、std::deque、std::list等3.