关于c ++:标准的命名空间问题


The standard Namespace problem

Hii,

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

那么,是不是

1
2
3
4
5
6
7
8
9
10
 namespace std
   {

     declaration of cout

     declaration of cin

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

   }

和isior中的实际实现istream和ostream ...... ????

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

1
2
3
4
5
6
7
namespace std
   {
     complete definition of cout
     complete definition of cin  
     .........

   }

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

1
2
3
4
5
6
7
iostream file
  {
    std :: cout
    std :: cin
    .....

  }

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


I do know that the functions cout ,
cin etc... are defined in the standard
name space.

这些不是真正的函数,而是basic_ostreambasic_istream的全局实例。

But we also include iostream header file for running the program.

您更喜欢包含标题,以便编译源代码(编译器需要声明等)。

问题的其余部分相当模糊。如何实现标准库几乎取决于实现。该标准要求如果包含iostream,您将获得以下全局变量的声明:

1
2
3
4
5
6
7
8
9
10
11
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;
}


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

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


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

为了让您了解它是如何实现的,类std::ostream的定义可以在标题ostream中,它由iostream包含。同样在标题ostream中,std::cout可以定义为对std::ostream的引用。


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