根据项目定义不同的功能

时间:2013-02-02 22:42:33

标签: c++ preprocessor-directive

我目前有两个c ++项目,它们共享许多相同的源文件和头文件。其中一个是游戏服务器,另一个是客户端。我的一些类具有客户端或服务器独有的功能,因此只应为其中一个编译。但我不确定如何解决这个问题。到目前为止,我的尝试是:

  1. 在Client.h中使用#define IS_CLIENT(包括主函数)和Server.h中的#define IS_SERVER。这失败了,因为其他标题必须#include它们(所以当我想编译某些内容时,我最终必须修改所有标题)

  2. 使用#include "CompileType.h",其中CompileType.h定义IS_CLIENT或IS_SERVER。这是前一种方法的一项重大改进,但是每当我想编译时,我仍然会更改文件。

  3. 两次尝试都使用#ifdef#endif围绕.cpp文件中的选择函数定义。

    如果可能的话,可能的解决方案是全局范围内的#define某事(因此它会影响所有源文件和头文件)。我的IDE(Code :: Blocks)设置中可能还有一些我还没有看到过的东西。

    对此问题的任何见解都将不胜感激。

2 个答案:

答案 0 :(得分:1)

最好的方法是完全分离您的功能,以便所有“服务器”功能都在一个或多个仅用于服务器的文件中,并且您的所有“客户端”都在其自己的文件中。所以,基本上,你有三个目录,一个是“服务器”文件,一个是“客户端”文件,另一个是“常见”文件。

不应该在源文件中使用#if#ifdef,除非解决这个问题的努力确实非常巨大。

答案 1 :(得分:0)

对于我参与的一个项目,我们有一个具有核心功能的程序和几个可选模块。然后,属于模块的每个文件都在一些#ifdef MODULENAME / #endif块中写入,然后可以通过在项目规模定义MODULENAME来确定要编译的模块(在Visual Studio中使用属性表,但是代码块有一些等价物。在磁盘上,每个模块文件都在不同的文件夹中,因此它不会太乱,这个解决方案也可以为你工作。