我開始學習C++,我讀了一本書,它寫道我必須使用<string>
頭文件,因爲字符串類型不是直接編譯到編譯器中的。 如果我使用<iostream>
,我可以使用字符串類型。我是否必須使用#include <string>旁邊的<iostream>?
當我想要使用字符串類型時,如果包含<iostream>
標頭,是否必須包含<string>
標題?爲什麼?有一些區別嗎?
我開始學習C++,我讀了一本書,它寫道我必須使用<string>
頭文件,因爲字符串類型不是直接編譯到編譯器中的。 如果我使用<iostream>
,我可以使用字符串類型。我是否必須使用#include <string>旁邊的<iostream>?
當我想要使用字符串類型時,如果包含<iostream>
標頭,是否必須包含<string>
標題?爲什麼?有一些區別嗎?
是的,你必須包括你使用的。標準頭文件不包含另一個頭文件(除少數IIRC外)。它現在可能工作,但可能會在其他編譯器上失敗。
在你的情況下,顯然<iostream>
包括<string>
,直接或間接,但不要依賴它。
當我想要使用字符串類型時,如果包含
<iostream>
標題,是否必須包含<string>
標題?
是的,你必須。您不能依賴通過其他頭部(例如<iostream>
)間接獲得的相關頭文件(例如<string>
)爲#include
d,儘管在某些實現中可能會出現這種情況。
而且,即便這可能似乎工作,它可能會導致麻煩,如果不是所有的一些運營商的相關重載的都是進口的,或者如果一個類是在頭你#include
前瞻性聲明,但對信息從其他類派生出來的類僅包含在不能獲得#include
d的標題中。
例如,參見this Q&A on StackOverflow查看這種情況的一個例子。
[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
很好的一點。我遇到了一個問題,即我們使用的一些庫代碼依賴於此,當我們從一個非常舊的操作系統/編譯器升級到新版本時,編譯打破了「沒有明顯的原因」,除此之外。 – user320781 2014-12-15 18:00:27
這可能是字符串的前向聲明(包括,其中包括 ing gcc的實現)。我認爲這是標準的行爲(雖然必須檢查標準),所以我相信當他不需要完整的類型時他可以依靠它。 –
Aleph
2013-05-12 10:00:32
@AnotherTest「我可以使用字符串類型」 - 告訴我他需要完整的類型。如果他不這樣做,是的,一個前瞻性聲明會這樣做。 – 2013-05-12 10:03:02
27.5.1聲明必須包含。這隻需要'char_traits',所以我不確定編譯器是否也必須轉發declare'string'。我仍然懷疑任何iostream的實現都包含整個字符串頭文件。 –
Aleph
2013-05-12 10:16:09