tom@runxtsa.runx.oz.au (Thomas Antalffy) (08/21/90)
THE TASK: I have to rewrite C++ 2.0 streams to work under Microsoft Windows, i.e: write .c files that can be compiled for MS Windows to match the AT&T .h-s. This should be fairly straightforward given the fact that I have done the same for C++ 1.2 streams. THE PROBLEM: 2.0 has a class Iostream_init that initializes cin, cout, cerr and clog. At any stage in globally scoped objects the Iostream_init constructor can be called to ensure that predefined streams are working. In other words Iostream_init::Iostream_init() has to initialize cin, cout, cerr and clog. Lets take cout as an example. In <iostream.h> (where Iostream_init is declared) cout is declared as extern ostream_withassign. The only methods of ostream_withassign are ostream_withassign(void), ~ostream_withassign(void), operator=(ostream), operator=(streambuf). In other words the only way to create an ostream_withassign associated with a certain file descriptor is to create a 'blank' one with the constructor, and then assign an ostream opened on that file descriptor to it. So, how can Iostream_init::Iostream_init() assign to cout, given that cout might well not be initialized (constructed) at the time (the order of static constructions is only guarantied within one file) ? I tried assigning to cout while it was uninitialized, and had all kinds of trouble - basically 'this' ended up being NULL. Alternatively how can one force the initialization of a variable declared as extern, and ensure that when the real static constructor comes around, it does not mess up the values ? Or putting it another way, does anyone have any idea how C++ 2.0 does it ?