[英]Keep track of macro expansion
我想跟蹤宏擴展-宏已擴展了多少次,擴展發生時的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可以用預處理程序短語保持其狀態。 但是我仍然不清楚該怎么做。
這樣的事情怎么樣?
#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都要進行不同數量的掃描,這會使結果每次都不同。
宏不會影響全局狀態。 實現某種狀態的唯一其他方法是使用遞歸。 請記住,宏不會遞歸擴展,因此預處理器會跟蹤此狀態。 它是唯一受宏影響的“全局”狀態。 但是,可能難以控制。 必須強制宏在某個遞歸級別上擴展,每個級別都有一個宏,並且需要某種形式的二進制搜索才能有效地讀取“狀態”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.