标准的命名空间问题

时间:2010-09-13 13:32:09

标签: c++

Hii,

我对编程C ++比较陌生。我知道函数cout,cin等...在标准名称空间中定义。但我们还包括用于运行程序的iostream头文件。

所以,就像是

 namespace std
   {

     declaration of cout 

     declaration of cin 

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

   }

并且在istream和ostream中的实际实现...... ????

或者,是否反过来...... ???喜欢....

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

   } 

并且他们的签名只是放在iostream文件中,如...

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

  }

请提供您认为可以帮助我更好理解的任何示例或链接

4 个答案:

答案 0 :(得分:4)

  

我知道cout的功能,   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;
}

答案 1 :(得分:2)

标准真的没有说。实现者完全可以将它作为一个只有头的库来实现,但是他们更有可能只将声明放在头文件中并将实现放在CRT中。

编辑:但是,cincout等的定义需要extern并在某种库中定义。 (见UncleBens的回答)

答案 2 :(得分:1)

cincout不是简单变量 - 使用cerr它们是默认情况下为使用iostream的每个应用程序注册的流。如果不包含该标题,则无法使用它们。

答案 3 :(得分:1)

要使用cincout,您只需知道它们位于std命名空间中,并且您需要包含iostream才能使用它们。< / p>

为了让您了解如何实施,类std::ostream的定义可能位于ostream标题iostream中。同样在标题ostream中,std::cout可以定义为对std::ostream的引用。