A few notes about C++ compilers (Watcom C++, Borland C++, M$C++) :

 - there is no standard for the following:
    a) naming convention :  Each compiler uses it's own so you can not
       mix code from each compiler.
    b) how global constructors and deconstructors should be called.
      Borland uses the _INIT_ and _INITEND_ segments for constructors
        and the _EXIT_ and _EXITEND_ for it's deconstructors.
      Watcom uses similar segmensts called XIB,XI,XIE for the constructors.
        It uses the CONST2 for the deconstructors (but in a different manner).
      M$C uses .CRT$XCU (why the hell?).
      Borland's and Watcom's segments are somewhat the same inside in that
        each entry in the segments are as follows:
          db 0
          db priority
          dd offset constructor
        But this applies only to the constructor segments for Watcom.
      M$C simply uses a list of 'dd offset constructor's.
      M$C has no destructor tables but somehow still calls the destructors,
        it must call them right before it ends main().
 - Borland C inserts special virtual "tags" into their OBJ (and ASM) files
   when creating C++ programs which WLINK can not handle.  The -Vs option
   has fixed this problem.  But note that adding this option with -S
   causes an internal error in BC, this only effects BCPP2ASM.BAT (new).
 - M$C somehow seems to call it's deconstructors without me calling them
   during shutdown.  Must do it right before using 'ret' in main().  But I'm
   unsure about that, cause I didn't see where.
 - Watcom calls over 20k (possibly more) of code at anytime with it's C++
   code for some unknown reason.  Right now I make all known functions
   simply 'ret' within my library (QLIB).

So as you can see the C++ world is fucked!

Please read fastcall.txt for info on the wonderful world of fastcall
calling convention - another fucked reality.

TTYL - July/97

