簡體   English   中英

跟蹤宏擴展

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM