C ++中相同类的不同定义 - 处理多个目标

时间:2012-10-04 12:10:38

标签: c++ c cross-platform

我的问题是我想组织我的代码,所以我可以有相同方法的 debug 发布版本,我可以有多个定义的针对不同目标平台的相同方法。

基本上问题的核心是两者都相同,我需要具有相同的签名,但关联的定义不同。

在文件系统上组织代码以及编译和生成代码的最佳方法是什么,这样我可以保持清洁和分离?

感谢。

3 个答案:

答案 0 :(得分:2)

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


#ifdef DEBUG

// function definition for debug

#else

// function definition for release

#endif

对于不同的操作系统也可以这样做。当然有重新编译所有这些的问题,这可能是C ++中屁股的痛苦。

答案 1 :(得分:1)

我建议您在源级别而不是在头文件上进行干预(只是为了确保保持相同的接口),例如:

//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

相反,如果您希望将所有内容分开,则必须使用更高的杠杆,预处理器不足以有条件地包含.cpp文件而不是另一个.cpp文件。您必须使用 makefile 或您使用的任何内容。

另一种选择可能是让源文件在不在特定平台上时消失,例如:

//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

答案 2 :(得分:1)

如果您的编译器允许,您可以尝试将每个版本的源文件保存在单独的子文件夹中(例如#include "x86_d/test.h"),然后使用全局宏定义来控制流程:

#define MODE_DEBUG

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

您还可以为成员函数定义使用类似的结构,以便在同一文件中可以有两个不同的定义。许多编译器也使用自己的全局宏定义,因此您可以使用#define MODE_DEBUG之类的内容而不是上面的#ifdef _CPP_RELEASE,甚至可以通过编译器标志定义一个。