2010-09-13 51 views
3

嗨,標準命名空間問題

我對編程C++比較新。我知道cout,cin等功能是在標準名稱空間中定義的。但是我們還包含運行該程序的iostream頭文件。

那麼,是不是像

namespace std 
    { 

    declaration of cout 

    declaration of cin 

    ..... some other declarations etc.... 

    } 

和內部istream和ostream的... theior實際實現????

或者,它是相反的方向...... ???像....

namespace std 
    { 
    complete definition of cout 
    complete definition of cin 
    ......... 

    } 

和他們的簽名只是放在了iostream文件中像...

iostream file 
    { 
    std :: cout 
    std :: cin 
    ..... 

    } 

請提供您可能認爲會幫助我瞭解任何實例或鏈接更好

+0

它是實現定義的。但類(std :: basic_stream)在名稱空間std內聲明,對象(std :: cin,std :: cout)也是如此。天氣裏有一個定義的頭文件中的類/對象是實現定義的。 – 2010-09-13 14:33:28

回答

4

我知道的功能清點, CIN等......在標準 的命名空間中定義。

這些不是真正的函數,但是全局實例爲basic_ostreambasic_istream

但我們還包括運行該程序的iostream頭文件。

您寧願包含頭文件,以便編譯源代碼(編譯器需要聲明等)。

問題的其餘部分相當模糊。標準庫的實現方式與實現相差無幾。該標準要求如果包含iostream,您將得到以下全局變量的聲明:

namespace std { 
    extern istream cin; 
    extern ostream cout; 
    extern ostream cerr; 
    extern ostream clog; 

    extern wistream wcin; 
    extern wostream wcout; 
    extern wostream wcerr; 
    extern wostream wclog; 
} 
+0

+1 - 雖然我不知道它們必須是'extern' ... – 2010-09-13 13:48:05

+2

@Billy:如果沒有'extern',這些將是定義而不是聲明,並且您不希望在頭文件中定義外部對象。 – 2010-09-13 13:51:30

+0

@Bens:所以,當我們使用cout時,cin我們正在使用basic_ostream,basic_istream對象......? basic_istream和basic_ostream處理o/p和i/p的設施。 – Flash 2010-09-13 14:11:57

1

cincout不是簡單的變量 - 與cerr他們是流默認註冊爲每個應用程序使用iostream。如果不包含該標題,則不能使用它們。

2

標準真的不說。實現者完全可以將它作爲僅包含頭的庫來實現,但它們更可能只是將聲明放在標題中並將實現放在CRT中。

編輯:但是,cin,cout等的定義需要是extern和在某種類型的庫中定義。 (見UncleBens的回答)

1

要使用cincout你真的只需要知道他們在std命名空間,你需要包括iostream使用它們。

爲了給你一個想法如何實現,類std::ostream的定義可以在標題ostream中,其包含在iostream中。同樣在標題ostream中,可以將std::cout定義爲對std::ostream的引用。