【发布时间】:2016-07-03 21:50:50
【问题描述】:
我有两个应用程序“服务器”和“客户端”,它们依赖于许多相同的代码。 他们需要以不同的方式与控制台交互。我不想编写一个处理这两种情况的类,而是想在两种不同的情况下包含两个不同的类。现在,在 Globals.h 和 Globals.cpp 我这样做:
Globals.h:
#ifdef SERVER
extern ConsoleUI ui;
#else
extern Logger ui;
#endif
Globals.cpp:
#include "Globals.h"
#ifdef SERVER
ConsoleUI ui;
#else
Logger ui;
#endif
(我在标题中也包含了守卫,但将它们留在这里)。
在服务器的主文件中,我定义:
#define SERVER
在客户端的主文件中,我使用:
#define CLIENT
但是,它们最终都创建了 Logger ui 而不是 ConsoleUI ui。 我知道这一点是因为服务器尝试调用存在于 ConsoleUI 和段错误中的函数,因为出于某种原因,他的“ui”属于“Logger”类型。
我确实意识到一种更简洁的方法可能是将 Globals 分成 GlobalsClient.h/.cpp 和 GlobalsServer.h/.cpp,但我想了解为什么上面的代码不起作用。
希望以前没有人问过这个问题,我搜索的所有内容都没有给我任何有用的点击。
【问题讨论】:
-
一般来说,在 C++ 中实现你想要的东西有更好的方法。如果有很多通用代码,如何创建一个包含该代码的基类并拥有 2 个实现非通用代码的派生类?
-
听起来是个坏主意!不过,您必须使用
-DSERVER或-DCLIENT编译所有项目源,恐怕仅在main.cpp中设置定义是不够的。
标签: c++ c-preprocessor