Where is cout declared?

20,069

Solution 1

Yes, that is indeed the declaration of std::cout, found inside the <iostream> header.

The relevant standard part can be found in §27.4.1 [iostream.objects.overview]:

Header <iostream> synopsis

#include <ios>
#include <streambuf>
#include <istream>
#include <ostream>

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;
}

p1 The header <iostream> declares objects that associate objects with the standard C streams provided for by the functions declared in <cstdio> (27.9.2), and includes all the headers necessary to use these objects.

Solution 2

Is that the declaration of cout, and is cout an instance of the ostream class?

Yes, that is the declaration of std::cout and yes it's an instance of std::ostream. It is declared extern so that the object is only created once even if the header is included in multiple translation units.

Share:
20,069
Moshe
Author by

Moshe

iOS Engineer Website | GitHub | Careers | App Store

Updated on October 11, 2020

Comments

  • Moshe
    Moshe over 3 years

    My computer science professor wants us to find the declaration of cout. I've compiled a simple Hello world program using g++ and the -E parameter. Here's what my hello.cpp looks like:

    #include <iostream>
    
    using namespace std;
    
    int main(){
    
      string name="";
    
      cout << "Good morning! What's your name?";
    
      cin >> name;
    
      cout << "Hello " << name << ".\n";
    
      return 0; 
    
    }
    

    My compile command:

    g++ -E hello.cpp > hello.p
    

    In hello.p, I ran a search in VIM, like so:

    :/cout
    

    I see the following line:

    extern ostream cout;
    

    Is that the declaration of cout, and is cout an instance of the ostream class?

    Edit:

    What's the wcout declaration there for? If I recall correctly the letter "w" stands for "wide", but I don't know what implication that has. What is a wcout and a wostream?

  • moshbear
    moshbear about 12 years
    Don't forget the namespace std { ... } part. It's std::ostream std::cout, not ::ostream ::cout.
  • Xeo
    Xeo about 12 years
    @Moshe: wcout is just a basic_ostream specialized on wchar_t, which means UTF-16 on Windows and UTF-8 on Linux IIRC.