用预处理器#define替换作用域标识符

Replacing scoped identifier with preprocessor #define

本文关键字:作用域 标识符 替换 #define 预处理 处理器      更新时间:2023-10-16

我想基于预处理器定义来声明对象的类型。问题是对象类型是用名称空间限定的:

OldNamespace1::OldNamespace2::OldClass MyObject;

现在,当定义了__unit_test时,我希望编译器看到:

NewNamespace1::NewNamespace2::NewClass MyObject;

我有OldClass的来源,但我在OldNamespace1中没有任何东西。我知道使用#ifdef条件包含显然可以做到这一点,但这将需要在整个代码中使用许多#ifdef。有没有办法只使用一种(可能是化合物)#define

您可以定义这样的名称空间:

#ifdef __unit_test
namespace myns = NewNamespace1::NewNamespace2;
class myclass : public NewClass {};
#else
namespace myns = OldNamespace1::OldNamespace2;
class myclass : public OldClass {};
#endif

现在,您可以简单地通过以下方式定义对象:

myns::myclass MyObject;