標籤:

string頭文件和string.h頭文件是一樣的?

我在書里看到這一段:

C++ primer 5th P67

為了確保各個文件中類的定義一致,類通常被定義在頭文件中,而且類所在頭文件的名字應與類的名字一樣。例如,庫類型string在名為string的頭文件中定義。又如,我們應該把Saels_data類定義在名為Saels_data.h的文件中。

......頭文件也經常用到其它頭文件的功能。例如,我們的Sales_data類包含有一個string成員,所以Sales_data.h必須包含string.h頭文件。同時,使用Sales_data類的程序為了能操作bookNO成員需要再一次包含string.h頭文件。

查到的一篇文章:

頭文件string與string.h的區別 - compilerTech - 博客園

我的問題:

1.我不是很理解C++ primer中的那段話,string頭文件和string.h頭文件不是同一個東西?

查到的那篇文章的意思是確實不是同一個東西。string是一個類,string.h是c遺留的東西,按這個理解書里的那段話,string.h是一種對成員執行操作的頭文件,可是感覺不對啊,既然是操作,不應該是

「我們的Sales_data類包含有一個string成員,所以Sales_data.h必須包含string頭文件。同時,使用Sales_data類的程序為了能操作bookNO成員需要再一次包含string.h頭文件」這樣才對么?

2.是不是系統類都是沒有.h,自己定義的類都必須有.h。以此來區分自己定義的和系統自帶的類?


對於你現在寫的C++來說不是一個東西。

string頭文件指的是&,定義了std::string的相關內容:

#include&
#include&
using namespace std;
int main()
{
string str1,str2;
cin&>&>str1&>&>str2;
cout&<&

string.h頭文件的話指的是C語言風格的字元串相關庫的頭文件——在C++中一般寫作&,所有C語言庫一般都寫作cxxxx:

#include&
#include&
int main() {
char hello[100] = "hello ";
char world[100] = "world";

printf("%s
", hello);
strcat(hello,world);
printf("%s
",hello);
return 0;
}


C 的 & 是處理 Null-terminated byte strings 的函數,如 strcpy()、strcat() 等;在 C++ 應該使用 Standard library header &,對應的函數最好加上 std 命名空間,如 std::strcpy()、std::strcat() 等。

C++ 的 Standard library header & 定義了 std::basic_string&<...&> 字元串模板類(如 std::string、std::wstring 等)及其他字元串函數。

C++ 的標準庫頭文件都是沒 .h 後綴的,含 .h 後綴的都是被廢棄的(deprecated)。


iostream.h和string.h在Windows上已經是上個世紀的東西了,早就淘汰了,你不用管,就當沒有iostream.h和string.h存在過。

當然書裡面提到過的string.h可能不是我說的這個string.h,但是iostream.h肯定是我說的iostream.h。


http://zh.cppreference.com/w/cpp/header

C++ 標準庫頭文件的說明看這裡,雖然描述可能有一些不精確。

個人理解是 C++ 傾向標準庫頭文件無後綴,而第三方庫頭文件使用 .h/.hpp 後綴。來自 C 的頭文件都換了 cxxxx 的馬甲,可能是因為寫成 xxxx.h 就顯得像非標準庫。


string.h在c++中指的是cstring這個頭文件,就是有strlen等一系列函數的頭文件。在c++中,建議這樣寫#include&,不要這樣寫#include&,雖然用處一樣,但前者更清楚。

#include&,指的是c++的string,就是basic_string特化的那個東西。


「string.h」和「cstring」是一個東西,「string」比「cstring多了一個字元串類型,但是我用到現在,似乎「string」里包含了幾乎所有的「cstring」的函數。

另外,大多數情況下,「xxx」和「xxx.h」是一樣的,但是因為c++的自帶函數庫實在是有點多,所以經常會有程序員把自己的頭文件命名的和自帶的頭文件一樣。為了避免這些愚蠢的錯誤,所以「xxx.h」會優先檢索是否有自己寫的頭文件,之後是c標準庫,之後在檢索cpp標準庫頭文件。「cxxx」會優先檢索c標準庫,然後「xxx」會優先檢索cpp標準庫。

再加一句話。這個命名方式就代表著會有一系列的同名頭文件。「string」是寫在代碼里的,但是文件名叫做「string.h」;「cstring」是寫在代碼里的,但是頭文件名也叫「string.h」;如果你在自己寫一個頭文件,也可以命名為「string.h」,三個文件名稱是一樣的。


看了你的問題,特意查了查書,你看書挺仔細的發現了這個問題,但是你咋不看看 Sales_data.h的定義呢,要動手查查啊。在Sales_data.h的定義中只是用到了 std::string,這個明顯是定義於 & 中的,再者Sales_data.h中關於的有關操作用都未出現與 c 字元串操作相關的內容,明顯是 **書中出現錯誤,將&誤寫為了&**。

在說說 cpp 頭文件,標準的 cpp 頭文件現在是都不帶 .h 的結尾的,只有自定義的才這個結尾。若你在書上遇到 .h結尾的標準頭文件,先看看 是不是 ccpp 頭文件混用,若是的,可以採用 c 語言庫對應的 cpp 版本,即有答者提到的 &版本,比如c中的& 對應的cpp 版本為&等。

還一個就是 歷史遺留問題,正如輪子哥說的,上世紀 cpp 的標準頭文件也是 .h 結尾。


簡單來說 帶.h的都是c語言遺留下來的庫 不帶.h的是c++新有的庫 c++可以兼容c但是反過來不行

另外c++primer對於零基礎來說還是有點難 可以再買一本c++primer plus看 這個更通俗易懂 兩本互相對照著學比較好


string.h約等於cstring

string就是string

前者是c的字元串處理函數頭文件,後者是c艹的std::string類的頭文件。

學語言別計較這些細微的東西,先知道,然後用。過段時間你會發現,哦,原來如此。

或者乾脆永遠用不到,比如你用了QT,用了UE4。


cstring = string.h


根據不知道哪裡來的標準規定標準庫里.h後綴表示c的標準庫(僅限純c編譯環境),沒有.h的是c++的標準庫,不過實際來看的話,如果c++ include c的標準庫也只是為了方便用c裡面的函數(然而c++的標準庫功能更多更方便用。),但是編譯方式一定是按照c++的編譯方式。


推薦閱讀:

為什麼c++要「在頭文件中聲明,在源文件中定義」?

TAG:C | CPrimer |