2013-05-12 28 views
15

我開始學習C++,我讀了一本書,它寫道我必須使用<string>頭文件,因爲字符串類型不是直接編譯到編譯器中的。 如果我使用<iostream>,我可以使用字符串類型。我是否必須使用#include <string>旁邊的<iostream>?

當我想要使用字符串類型時,如果包含<iostream>標頭,是否必須包含<string>標題?爲什麼?有一些區別嗎?

回答

17

是的,你必須包括你使用的。標準頭文件不包含另一個頭文件(除少數IIRC外)。它現在可能工作,但可能會在其他編譯器上失敗。

在你的情況下,顯然<iostream>包括<string>,直接或間接,但不要依賴它。

+0

這可能是字符串的前向聲明(包括,其中包括 ing gcc的實現)。我認爲這是標準的行爲(雖然必須檢查標準),所以我相信當他不需要完整的類型時他可以依靠它。 – Aleph 2013-05-12 10:00:32

+0

@AnotherTest「我可以使用字符串類型」 - 告訴我他需要完整的類型。如果他不這樣做,是的,一個前瞻性聲明會這樣做。 – 2013-05-12 10:03:02

+0

27.5.1聲明必須包含。這隻需要'char_traits',所以我不確定編譯器是否也必須轉發declare'string'。我仍然懷疑任何iostream的實現都包含整個字符串頭文件。 – Aleph 2013-05-12 10:16:09

7

當我想要使用字符串類型時,如果包含<iostream>標題,是否必須包含<string>標題?

是的,你必須。您不能依賴通過其他頭部(例如<iostream>)間接獲得的相關頭文件(例如<string>)爲#included,儘管在某些實現中可能會出現這種情況。

而且,即便這可能似乎工作,它可能會導致麻煩,如果不是所有的一些運營商的相關重載的都是進口的,或者如果一個類是在頭你#include前瞻性聲明,但對信息從其他類派生出來的類僅包含在不能獲得#include d的標題中。

例如,參見this Q&A on StackOverflow查看這種情況的一個例子。

+0

[ios_base :: getloc](http://en.cppreference.com/w/cpp/io/ios_base/getloc)按值返回'std :: locale',[locale :: name](http:/ /en.cppreference.com/w/cpp/locale/locale/name)通過值返回'std :: string',所以'#include '實際上需要完全定義'std :: string'。只有來自''的非成員是可選的。 – Cubbi 2013-09-14 15:28:39

+0

很好的一點。我遇到了一個問題,即我們使用的一些庫代碼依賴於此,當我們從一個非常舊的操作系統/編譯器升級到新版本時,編譯打破了「沒有明顯的原因」,除此之外。 – user320781 2014-12-15 18:00:27

相關問題