根据项目定义不同的功能 我现在有两个C++项目,它们共享许多相同的源文件和头文件。其中一个是游戏服务器,另一个是客户端。我的一些类具有客户端或服务器所独有的函数,因此应该只为其中一个类编译。然而,我不确定该怎么做。到目前为止,我的努力是:

根据项目定义不同的功能 我现在有两个C++项目,它们共享许多相同的源文件和头文件。其中一个是游戏服务器,另一个是客户端。我的一些类具有客户端或服务器所独有的函数,因此应该只为其中一个类编译。然而,我不确定该怎么做。到目前为止,我的努力是:,c++,preprocessor-directive,C++,Preprocessor Directive,在CLIENT.h(包括主功能)中使用#define IS_CLIENT,在SERVER.h中使用#define IS_SERVER。这失败了,因为其他头必须#包含它们(所以当我想编译一些东西时,我不得不修改所有头) 使用#包括“CompileType.h”,其中CompileType.h定义IS_客户端或IS_服务器。与前面的方法相比,这是一个重大的改进,但仍然让我在需要编译时更改文件 在.cpp文件中的select函数定义周围使用了#ifdef和#endif两种尝试 如果可能的话,一个可能的

在CLIENT.h(包括主功能)中使用
#define IS_CLIENT
,在SERVER.h中使用
#define IS_SERVER
。这失败了,因为其他头必须
#包含
它们(所以当我想编译一些东西时,我不得不修改所有头)

  • 使用
    #包括“CompileType.h”
    ,其中CompileType.h定义IS_客户端或IS_服务器。与前面的方法相比,这是一个重大的改进,但仍然让我在需要编译时更改文件

  • 在.cpp文件中的select函数定义周围使用了
    #ifdef
    #endif
    两种尝试

    如果可能的话,一个可能的解决方案是在全局范围内定义某种东西(因此它会影响所有源文件和头文件)。在我的IDE(代码::块)设置中可能还有一些我还没有看到的东西


    如果您能深入了解这个问题,我们将不胜感激。

    最好的方法是完全分离您的功能,这样所有“服务器”功能都位于一个或多个仅用于服务器的文件中,而所有“客户机”都位于它自己的文件中。因此,基本上,您有三个目录,一个包含“服务器”文件,一个包含“客户端”文件,一个包含“公共”文件


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

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

    如果您使用
    -g++
    ,则可以选择使用
    -DIS\u CLIENT
    /
    -DIS\u SERVER
    。它与
    -DNDEBUG
    相同:它定义了一个宏