我想跟踪宏扩展 - 宏的扩展有多少次,并且在扩展发生时args是什么。

例如,

我有一个宏可能看起来像这样:

#define mymacro(x) int x
.

和我的代码我有这样的东西:

mymacro(a);
mymacro(b);
.

在预处理器的结束时(哦是的,有没有办法让特定的宏成为最后一个扩展?),我想知道Mymacro已经使用了多少次,并且args通过了什么。在这种情况下,它将是2次,并且args将是a和b。

我正在调查Boost-Pre处理器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