是否可以使用预处理器函数创建其他 #define?

Can I create other #define's with a preprocessor function?

本文关键字:创建 其他 #define 函数 处理器 可以使 预处理 是否      更新时间:2023-10-16

我知道问完这个我会受到惩罚,我仍然想做这样的事情:

#define DEF_CLASS(x)  
  #define CLASS x 
  #define CONSTRUCTOR CLASS::CLASS 
  #define COPY_CONSTRUCTOR(x) CONSTRUCTOR(const CLASS& x)

也就是说,我想要一个动态定义其他"#defines"的"#define"函数。

我有一个无法重构的IDE,此外,由于其特殊作用,我想使构造函数,尤其是复制构造函数脱颖而出。
因此,我的目标是像这样对我的 c++ 类定义进行编程:

CONSTRUCTOR(int i):i(i){}
COPY_CONSTRUCTOR(other):i(other.i){}
void CLASS::fun1()
{
  //...
}

为此,目前我需要复制和粘贴三行 #define。我宁愿自动执行这些操作。有没有办法使用预处理器做到这一点?

否 -- §16.3.4/3:

生成的完全宏替换的预处理令牌序列不会作为预处理指令进行处理,即使它类似于一个 [...]

不,这样的DEF_CLASS(x)宏是不可能的。宏不是有状态的。你能做的最好的事情就是:

#define CONSTRUCTOR CLASS::CLASS
#define COPY_CONSTRUCTOR(x) CONSTRUCTOR(const CLASS& x)
...
#define CLASS X
    CONSTRUCTOR(int i):i(i){}
    COPY_CONSTRUCTOR(other):i(other.i){}
    void CLASS::fun1()
    {
      //...
    }
#undef CLASS
#define CLASS Y
    CONSTRUCTOR(int i):i(i){}
    COPY_CONSTRUCTOR(other):i(other.i){}
    void CLASS::fun1()
    {
      //...
    }
#undef CLASS

但我强烈建议您不要像这样滥用预处理器。为什么要用这些宏混淆正常的C++语法?接受C++的本质;不要试图把它变成一种不同的、更友好的语言。