質問

マクロ拡張を追跡したい - マクロがいくつか展開された回数と拡張が発生したときのargsは何回かけています。

例えば

マクロがこのように見えます:

#define mymacro(x) int x
.

そして私のコードではこのようなものがあります:

mymacro(a);
mymacro(b);
.

プリプロセッサ拡張の終わりに(ああ、特定のマクロを最後に展開する方法はありますか?)、MyMacroが使用されている回数とargsは何度も知りたいです。。この場合、それは2倍になり、ARGSはAとBです。

私はブーストプリプロセッサLibを調査していました。彼らはboost_pp_arrayを持っていますが、私はそれを「静的」にする方法がわからないので、後で使用することができます。

Boost_pp_counterに何かを見つけました。Boost_pp_counterがプリプロセッサフレーズでその状態を維持できるものであるようです。しかし、私はまだ私が欲しいものをする方法はまだ不明です。

役に立ちましたか?

解決

How about something like this?

#include <iostream>

int m_counter = 0;
const char *m_arguments[32] = { 0 };

#define COUNT_M(a) m_arguments[m_counter++] = #a;
#define M(a) COUNT_M(a) int a

int main()
{
    M(x);
    M(y);

    for (int i = 0; i < m_counter; i++)
    {
        std::cout << "m_arguments[" << i << "] = \"" << m_arguments[i] << "\"\n";
    }
}

他のヒント

I'm not quite sure what your ultimate goal is, but you can track the number of scans(not the number of expansions) using an active argument. An active argument expands each time that it is scanned by the preprocessor. For example,

#define EMPTY()

#define A(n) \
    A_INDIRECT EMPTY()()(BOOST_PP_INC(n)) 

#define A_INDIRECT() A

#define X(arg) arg
#define Y(arg) X(arg)
#define Z(arg) Y(arg)

   A(0)   // A_INDIRECT()(1)
X( A(0) ) // A_INDIRECT()(2)
Y( A(0) ) // A_INDIRECT()(3)
Z( A(0) ) // A_INDIRECT()(4)

Each invocation of A is subjected to a different number of scans, which causes the results to be different each time.

Macros can't effect the global state. The only other way to achieve some sort of state is to use recursion. Remember, macros don't expand recursively, so the preprocessor keeps tracks of this state. Its the only "global" state that can be affected by macros. However, it can be difficult to control. Macros have to be forced to expand at a certain recursion level with a macro for each level, and some form of binary searching is required to read the "state" efficiently.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top