1

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

#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 行。我宁愿自动做这些。有没有办法使用预处理器来解决这个问题?

4

2 回答 2

2

否——第 16.3.4/3 节:

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

于 2012-12-15T20:50:01.017 回答
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++ 的本质;不要试图把它变成一种不同的、更友好的语言。

于 2012-12-15T20:44:31.530 回答