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()
{
  //...
}

そのために、現在、3 つの #define 行をコピーして貼り付ける必要があります。私はむしろそれらを自動的に行いたいです。プリプロセッサを使用してこれを実現する方法はありますか?

4

2 に答える 2

2

いいえ-§16.3.4/3:

結果として完全にマクロ置換された前処理トークンシーケンスは、1つに似ていても、前処理ディレクティブとして処理されません[...]

于 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 に答える