我的问题是我想组织我的代码,以便我可以拥有相同方法的调试和发布版本,并且我可以为不同的目标平台定义相同方法的多个定义。
基本上问题的核心对于两者来说都是相同的,我需要具有相同的签名但关联的定义不同。
在文件系统上组织我的代码以及编译和生产的最佳方法是什么,以便我可以保持干净和分离?
谢谢。
我的问题是我想组织我的代码,以便我可以拥有相同方法的调试和发布版本,并且我可以为不同的目标平台定义相同方法的多个定义。
基本上问题的核心对于两者来说都是相同的,我需要具有相同的签名但关联的定义不同。
在文件系统上组织我的代码以及编译和生产的最佳方法是什么,以便我可以保持干净和分离?
谢谢。
// #define DEBUG - we're making a non debug version
#ifdef DEBUG
// function definition for debug
#else
// function definition for release
#endif
对于不同的操作系统也可以这样做。当然还有重新编译所有这些的问题,这在 C++ 中可能是一件痛苦的事情。
我建议您在源代码级别进行干预,而不是对头文件进行干预(只是为了确保保持相同的接口),例如:
//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 文件而不是另一个。您将不得不使用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
如果您的编译器允许,您可以尝试将每个版本的源文件保存在单独的子文件夹(例如#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
,甚至可以通过编译器标志定义一个。