两个使用 C++ 的项目中存在重复的类实现。当我尝试将两者的细微差别合并到一个类中时,我遇到了一个障碍,因为类中的 #define 直接依赖于两个项目中从该类创建的静态对象,如下所示。
来自项目1
enum severity_type
{
debug = 1,
error,
warning
};
template< typename T >
class logger
{
public:
logger(const std::string& name);
};
#define LOGGING_LEVEL_1
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\backup.log");
#ifdef LOGGING_LEVEL_1
#define LOG log_inst.print< severity_type::debug >
#define LOG_ERR log_inst.print< severity_type::error >
#define LOG_WARN log_inst.print< severity_type::warning >
#else
#define LOG(...)
#define LOG_ERR(...)
#define LOG_WARN(...)
#endif
#ifdef LOGGING_LEVEL_2
#define ELOG log_inst.print< severity_type::debug >
#define ELOG_ERR log_inst.print< severity_type::error >
#define ELOG_WARN log_inst.print< severity_type::warning >
#else
#define ELOG(...)
#define ELOG_ERR(...)
#define ELOG_WARN(...)
#endif
来自项目2
enum severity_type
{
debug = 1,
error,
warning
};
template< typename T >
class logger
{
public:
logger(const std::string& name);
};
#define LOGGING_LEVEL_1
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\restore.log");
#ifdef LOGGING_LEVEL_1
#define LOG log_inst.print< severity_type::debug >
#define LOG_ERR log_inst.print< severity_type::error >
#define LOG_WARN log_inst.print< severity_type::warning >
#else
#define LOG(...)
#define LOG_ERR(...)
#define LOG_WARN(...)
#endif
#ifdef LOGGING_LEVEL_2
#define ELOG log_inst.print< severity_type::debug >
#define ELOG_ERR log_inst.print< severity_type::error >
#define ELOG_WARN log_inst.print< severity_type::warning >
#else
#define ELOG(...)
#define ELOG_ERR(...)
#define ELOG_WARN(...)
#endif
在这里,您可以观察到我们有来自两个项目的两个静态对象。
我想在程序运行时拥有这些静态对象。但是当我尝试合并这些文件时,主要的瓶颈是 #define 的 项目1
#define LOGGING_LEVEL_1
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\backup.log");
#ifdef LOGGING_LEVEL_1
#define LOG log_inst.print< severity_type::debug >
#define LOG_ERR log_inst.print< severity_type::error >
#define LOG_WARN log_inst.print< severity_type::warning >
#else
#define LOG(...)
#define LOG_ERR(...)
#define LOG_WARN(...)
#endif
和项目2
#define LOGGING_LEVEL_1
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\restore.log");
#ifdef LOGGING_LEVEL_1
#define LOG log_inst.print< severity_type::debug >
#define LOG_ERR log_inst.print< severity_type::error >
#define LOG_WARN log_inst.print< severity_type::warning >
#else
#define LOG(...)
#define LOG_ERR(...)
#define LOG_WARN(...)
#endif
这些#define(如 LOG、LOG_ERR)在代码中的数千处使用。 您能否在这里建议一种更好的方法,无需修改#define,我可以合并这些类并为两个项目使用单个类。
我希望 #define 保持不变,并将重复的类合并为一个,并且静态对象也应该存在。
有人可以建议一种更好的方法,我可以在不触及 #define 的情况下重构此代码吗
重申问题以确保我理解:您有两个单独的代码库(称为
backup
和 restore
),其中您的 cpp 文件有一个 #include "logger.h"
,这是您上面显示的代码。您现在想要将两个代码库合并为一个代码库。
然后,通过构造,每个 .cpp 文件只能是其中一个
#include
logger.h
。此外,每个 .cpp 文件都会有自己的 log_inst
副本,因为您在标头中将其声明为 static
变量。
我建议将所有但
static
变量提取到logger-common.h
中。
然后您可以拥有包含以下内容的
logger-backup.h
:
#include "logger-common.h"
static logger< file_log_policy > log_inst(GetAppDataPath()+ "\\Logs\\backup.log");
反之亦然
logger-restore.h
。
这仍然意味着您需要修改代码库的
#include
,但这比更改每个 LOG
调用要少一个数量级。
如果你真的不想这样做,我想你可以调整每个代码库中文件的包含目录的顺序,以确保它们首先看到“他们的”logger.h,但这会让你的 IDE 感到非常困惑,同事们。