我想跟踪宏扩展 - 扩展宏的次数以及扩展发生时的args。
例如,
我的宏看起来像这样:
#define mymacro(x) int x
在我的代码中我有类似的东西:
mymacro(a);
mymacro(b);
在预处理器扩展的最后(哦,是的,有没有办法让特定的宏成为最后一个扩展?),我想知道mymacro被使用了多少次以及args通过了什么。在这种情况下,它将是2次,而args将是a和b。
我正在调查boost-preprocessor lib。他们有BOOST_PP_ARRAY,但我不知道如何使它“静止”,以便我可以在以后使用它。
我在BOOST_PP_COUNTER中找到了一些东西。看起来BOOST_PP_COUNTER可以在预处理器短语中保持其状态。但我仍不清楚如何做我想做的事。
答案 0 :(得分:0)
这样的事情怎么样?
#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";
}
}
答案 1 :(得分:0)
我不太确定您的最终目标是什么,但您可以使用活动参数跟踪扫描次数(而不是扩展次数)。每次预处理器扫描时,活动参数都会扩展。例如,
#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)
A的每次调用都会受到不同数量的扫描,这会导致每次结果都不同。
宏无法影响全局状态。实现某种状态的唯一其他方法是使用递归。请记住,宏不会递归扩展,因此预处理器会保留此状态的跟踪。它是唯一可以受宏影响的“全局”状态。但是,它可能很难控制。必须使用每个级别的宏强制宏在某个递归级别进行扩展,并且需要某种形式的二进制搜索来有效地读取“状态”。