10

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?

Xeo
  • 129,499
  • 52
  • 291
  • 397
Moshe
  • 57,511
  • 78
  • 272
  • 425

2 Answers2

8

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.

Xeo
  • 129,499
  • 52
  • 291
  • 397
  • @Moshe: `wcout` is just a `basic_ostream` specialized on `wchar_t`, which means UTF-16 on Windows and UTF-8 on Linux IIRC. – Xeo Mar 11 '12 at 16:12
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.

Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
StackedCrooked
  • 34,653
  • 44
  • 154
  • 278
  • 1
    Don't forget the `namespace std { ... }` part. It's `std::ostream std::cout`, not `::ostream ::cout`. – moshbear Mar 11 '12 at 04:21