C++

Help
ravuya
2004-10-12
2013-04-25
  • ravuya
    ravuya
    2004-10-12

    Do you have a relative timeframe on when this will be achieved? I can work from static allocation for the time being (probably a good idea, since we know the maximum memory ceiling) but I far prefer dynamic allocation.

     
    • Craig Edwards
      Craig Edwards
      2004-10-12

      No specific timeframe in mind.  At the time I commented, the libc that was in use was the old MS-based libc.

      There is a chance that it might just magically work with the newlib based libc (I recall reading somewhere that the default new and delete operators just use the normal malloc and free implementations). 

      At this stage, getting audio and networking is highest on my priority list.  Feel free to give it a go and report your results back here...

      --
      Craig

       
  • Andrew Fraser
    Andrew Fraser
    2005-01-05

    I am currently writing a XBox development framework around OpenXDK/SDL using C++. Converting to C++ requires a few hoops to be jumped through but is quite straightforward really.

    To use C++, you need to do the following :-

    1. I modified the sample makefile on the OpenXDK such that it used g++ as the compiler. If you do this, you need to remove -std=gnu99 and -ffreestanding from the CC_FLAGS.  I also changed the line .c.o: to .cpp.o:

    2. You need to implement new and delete. This is actually easier than it sounds ie.

    #include <stdlib.h>

    void * operator new ( size_t size )
    {
        return( malloc( size ) );
    }

    void * operator new [] ( size_t size )
    {
        return( malloc( size ) );
    }

    void operator delete( void *p )
    {
        free( p );
    }

    void operator delete [] ( void * p )
    {
        free( p );
    }

    The C++ compiler will handle the calling of the destructor prior to freeing the memory.
    Hopefully this will be implemented in the newlib standard library before the next release of OpenXDK.

    3. You will need to encapsulate the function prototypes in some of the header files with extern "C" to prevent name mangling. To do this, place the following code just before the first function prototype in each header file :

    #if defined(__cplusplus)
    extern "C"
    {
    #endif

    and just after the last function prototype :

    #if defined(__cplusplus)
    }
    #endif

    I don't have a list of all the header files that need to be modified but if you get "undefined blah" errors then you can bet that they need the above code.

    As with new and delete, hopefully this change can be made before the next release of OpenXDK.

    4. You need to declare XBoxStartup in your main cpp file thus:

    extern "C" void XBoxStartup()
    {
       ...
       ..
       ...
    }

    again to prevent name mangling upsetting things.

    5. The most difficult part of the conversion to c++ was finding out why the virtual tables were not being linked in to the final code. Without virtual tables, you cannot create virtual functions or abstract classes. Eventually I found that you can link in the gcc standard library which will solve this problem. This   should not cause a conflict with the newlib standard library as you should be using the -nostdlib flag in the compiler settings. To link in the standard library, add the following switch -lstdc++ to the LD_LIBS line in the make file.

    Sorry for such a long post but perhaps it will help others with the switch over to c++.

    Best Regards

    Andy Fraser

     
    • Jeff
      Jeff
      2006-01-10

      Coming from a background in Java developing, I am used to OO programming langauges.  The way I read what your saying, I would be able create objects and such, which i found out I couldn't after hours of trying to work out why the compiler was having issues with the keyword "new".
      Is this correct? I'm still pretty new to c/c++.

       
  • Fabian
    Fabian
    2005-06-07

    Wow!  Thanks.  I'm looking forward to trying this immediately.