我可以使用预处理器功能创建其他#define吗?

时间:2012-12-15 20:38:17

标签: c++ preprocessor-directive

我知道在问这个之后我会受到惩罚,但我还是想做这样的事情:

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

那就是我想要一个“#define”函数来动态定义其他“#defines”。

我有一个无法重构的IDE,而且我想制作构造函数,特别是复制构造函数,因其特殊的作用而脱颖而出。
因此,我的目标是编写我的c ++类定义,如下所示:

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

为此,目前我需要复制并粘贴三个#define行。我宁愿自动做那些。有没有办法使用预处理器来解决这个问题?

2 个答案:

答案 0 :(得分:2)

否 - §16.3.4/ 3:

  

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

答案 1 :(得分:1)

不,这样的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 ++是为了什么;不要试图将它变成另一种更友好的语言。