跟踪宏观扩张
Keep track of macro expansion
我想跟踪宏的扩展-宏被扩展了多少次,扩展时的参数是什么。
例如,
我有一个宏可能看起来像这样:
#define mymacro(x) int x
在我的代码中,我有这样的东西:
mymacro(a);
mymacro(b);
在预处理器扩展的最后(哦,是的,有没有办法让一个特定的宏成为最后一个扩展的宏?),我想知道mymacro被使用了多少次,传递了什么参数。在这种情况下,它将是2次,args将是a和b。
我正在研究boost预处理器库。他们有BOOST_PP_ARRAY,但我不知道如何使其"静态",以便以后可以使用它。
我在BOOST _PP_COUNTER中发现了一些东西。看起来BOOST _PP_COUNTER可以在预处理器短语中保持其状态。但我仍然不清楚如何做我想做的事。
这样的东西怎么样?
#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";
}
}
我不太确定您的最终目标是什么,但您可以使用活动参数跟踪扫描次数(而不是扩展次数)。每次预处理器扫描活动参数时,它都会展开。例如,
#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都要经过不同数量的扫描,这导致每次的结果都不同。
宏无法影响全局状态。实现某种状态的唯一其他方法是使用递归。记住,宏不会递归扩展,所以预处理器会跟踪这种状态。它是唯一可以受宏影响的"全局"状态。然而,它可能很难控制。宏必须在一定的递归级别上进行扩展,每个级别都有一个宏,并且需要某种形式的二进制搜索才能有效地读取"状态"。
相关文章:
- 光线跟踪器灯光反射错误
- 人脸跟踪arduino代码的优化
- 跟踪滚动条上的鼠标事件
- 如何使用新运算符跟踪在循环中创建的 QLabel
- MSVC中的宏观扩展问题
- C++:跟踪类对象
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 跟踪日志中的T.11803()是什么意思?
- 我能做些什么来跟踪矢量元素?
- 两个进程可以通过跟踪附加到同一个 PID 吗?
- 提升堆栈跟踪不显示函数名称和行号
- cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 class4.exe.sta
- 如何按指针查看堆栈跟踪
- WinDbg 不显示某些小型转储文件的完整堆栈跟踪
- C++ MFC 跟踪事件调用
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 发布代码的 gdb 堆栈跟踪可读性如何影响 x64?
- MATLAB:跟踪imufilter对象中的状态变化
- 跟踪宏观扩张