user1717079
user1717079

Reputation: 523

Different definitions for the same classes in C++ - handling multiple targets

my problem is that i would like to organize my code so i can have a debug and release version of the same methods, and i can have multiple definitions of the same methods for different targeted platforms.

Basically the core of the problem is the same for both, i need to have the same signature but with different definitions associated.

What is the best way to organize my code on the filesystem and for compilation and production so i can keep this clean and separated ?

Thanks.

Upvotes: 2

Views: 178

Answers (3)

Jack
Jack

Reputation: 133577

I suggest you to intervene at source level and not on header files (just to be sure to keep same interfaces), something like:

//Foo.h

class Foo{
  void methodA();
  void methodB();
};


//Foo.cpp

// common method
Foo::methodA() { }

#ifdef _DEBUG_
  Foo::methodB() { }
#elif _PLATFORM_BAR_
  Foo::methodB() { }
#else
  Foo:methodB() { }
#endif

If, instead, you want to keep everything separated, you will have to work on a higher lever, the preprocessor is not enough to conditionally include a .cpp file instead that another. You will have to work with the makefile or whatever you use.

Another choice could be the one of having source files that simply disappear when not on specific platform, eg:

//Foo.h

class Foo{
  void methodA();
  void methodB();
};

//FooCommon.cpp

void Foo::methodA() { }

//FooDebug.cpp
#ifdef _DEBUG_H
void Foo::methodB() { }
#endif

//FooRelease.cpp
#ifndef _DEBUG_H_
void Foo::methodB() { }
#endif

Upvotes: 1

Ghost2
Ghost2

Reputation: 532

If your compiler allows, you can try keeping the source files for each version in a separate subfolder (eg #include "x86_d/test.h") then using global macro definitions to control the flow:

#define MODE_DEBUG

#ifdef MODE_DEBUG
#include "x86dbg/test.h"
#else
#include "x86rel/test.h"
#endif

You can also use a similar structure for member function definitions, so that you can have two different definitions in the same file. Many compilers also use their own defines for global macros as well, so instead of #define MODE_DEBUG above, you might be able to use something like #ifdef _CPP_RELEASE or maybe even define one through a compiler flag.

Upvotes: 1

kuniqs
kuniqs

Reputation: 308

// #define DEBUG   -  we're making a non debug version


#ifdef DEBUG

// function definition for debug

#else

// function definition for release

#endif

The same can be done for different operating systems. There's of course the problem of recompilating all of it, which can be a pain in the ass in C++.

Upvotes: 2

Related Questions