2

タイトルのいい言い方が思いつきませんでした…

#define X(c) c
#define Y(c) X(c)
#undef X

int main(int argc,char*argv[])
{
    std::cout << Y(5) << std::endl;
    return 0;
}

X() がこのスコープで宣言されていないため、これによりエラーが発生します。Y に X のコピーを格納させる方法はありますか (別名、Y を定義するときにマクロ置換を強制的に発生させる)、X の存在に依存しなくなりますか? おそらく、ブーストにはこれのためのプリプロセッサがいくつかあるか、簡単な方法があるかもしれません。アイデア?

4

3 に答える 3

6

C プリプロセッサは力ずくでテキストを置換します。スコープの意味がなく、この方法でクロージャーを作成するために使用することはできません。

于 2010-02-24T23:12:58.480 に答える
3

いいえ、標準のプリプロセッサを使用してそれを行う方法はありません。

実際に使用する前に X を定義解除する必要があるのはなぜですか?

于 2010-02-24T23:07:38.010 に答える
0

いいえ、できません。

自分でいくつかの前処理プログラミングを使用したので、その必要性は理解しています。たとえばBOOST_PP_FOR_EACH、ループの各ターンで呼び出されるマクロを渡すことになっていますが、このマクロはローカルでしか役に立たず、シンボルのテーブルを乱雑にします.. . 名前の競合を引き起こす可能性があります。

それを呼び出すマクロを動作させずにこれを行う方法はないためundef、一般的な解決策は、後でこの名前を再利用するリスクに遭遇しないように、マクロに長くて扱いにくい名前を付けることです。

この点に関して、Boost には非常に便利な命名規則があります。

PROJECT_PATH_FUNCTION

たとえば、BOOST_PP_FOR_EACH私が話していた は、 を含めることで見つけることができますboost/preprocessor/for_each.hpp

明示的にパスを指定することで、他のユーザーがマクロをすばやく見つけるのに役立つだけでなく、ファイル内で混乱していないことをすばやく確認できるため、衝突を回避できます。

于 2010-02-25T09:21:17.120 に答える