0

スコープをパラメータとして取るマクロを作成しようとしています。
私は知っています、それはおそらく良いことなどではありません。
これを試していて、プリプロセッサがコンマと括弧を探すという問題が発生しました...問題は列挙型にあります。

マクロのパラメーターであるスコープ内で列挙型を宣言するにはどうすればよいですか?

コンパイラは、列挙項目間のコンマを検出すると、それを区切り文字として認識します。

私がこれに参加した理由を知りたい場合は、名前空間とクラスを登録する必要があるためです。名前空間については、それらがいつ閉じられるかを知る必要があるため、登録する静的関数を最初に呼び出すマクロを作成することを考えていました名前空間をカプセル化し、最後にレジストリから名前空間を削除する静的関数を呼び出します。
マクロを使用すると、コーダーがこれを行うのが簡単になり、ブラケットの最後の名前空間を削除するのを忘れないようにすることができます。

ありがとう、
ジョー

編集:

スコープをパラメーターとして受け入れるマクロが必要です。

#define MYMACRO(unkownscope) unknownscope

class MYMACRO({
   // please, don't take this code seriously, it is just an example so you can understand my question
});

今、私が試してみると:

#define MYMACRO(unkownscope) unknownscope

class MYMACRO({
  enum {
    anything = 1,
    everything = 2
  };
});

コンパイラはそれがマクロの区切り記号であると考えるため、列挙型内のコンマのためにコンパイルされません。括弧内のコンマでは発生しません。例:

 int a(){
    int x = anyfunction(1, 2);
 }

コンマが二重括弧内にあるため、正常にコンパイルされます。

先に説明できなくてすみません... 私の英語はそれほど上手ではなく、単語がスキップされ続けています =[

答えはタイ!
ジョー

4

4 に答える 4

1

プリプロセッサを進んでいるところを超えてプッシュしているようです。それほどエレガントではありませんが、マクロを2つ(1つは前と1つ後)に分割し、パラメーターとして「スコープ」を渡すのではなく、スコープを前マクロと後マクロで囲みます。

したがって、マクロが次のようになっている場合:

SOMACRO({ ... });

代わりに、次のようなことを行います。

PRESOMACRO();
{ ... };
POSTSOMACRO();
于 2009-11-19T21:40:46.500 に答える
0

あなたはすでに問題が何であるかに気づきました、boostpro.comの記事問題を要約します。回避策はありますが、 Boost.Preprocessor を利用することにします。

構文的に何を達成しようとしているのかを正確に知らなくても、次のようなものがあなたが探しているものである可能性があります(PP_SEQに編集):

#define MAKE_ENUM(Name, Seq) enum Name { BOOST_PP_SEQ_ENUM(Seq) }
MAKE_ENUM(foo, (a)(b)(c));
于 2009-11-19T22:09:44.413 に答える
0

マクロを使用して RAII を複製しようとしています。

#define SCOPE(ns) NamespaceRegistrar _ns_rar(ns);
struct NamespaceRegistrar {
    std::string _ns;
    NamespaceRegistrar(const std::string& ns) : _ns(ns) { AcquireResource(_ns); }
    ~NamespaceRegistrar() { ReleaseResource(_ns); }
};


{
     SCOPE("Foo")
     // stuff
} 

列挙型に関してあなたが何について話しているのかわかりません。

于 2009-11-19T21:57:21.463 に答える
0
#define SCOPED_STUFF(pre,post) pre; STUFF; post;

#define STUFF enum {a,b,c}
SCOPED_STUFF(a,b)
#undef STUFF

#define STUFF enum {q,r}
SCOPED_STUFF(c,d)
#undef STUFF
于 2009-11-19T21:42:08.230 に答える