2015-12-25 49 views
2

我有一個包含文件中的以下內容:如何從boost :: wave獲得完整的,擴展的,串化的宏?

#define str(s) s 
#define xstr(s) #s 
#define foo 4 
#define first str(foo) 
#define second xstr(foo) 

當我進入的boost ::波對此,macromap包含以下內容:

first=str(foo) 
foo=4 
second=xstr(foo) 
str(s)=#s 
xstr(s)=str(s) 

我怎樣才能獲得宏完全展開這樣:

first="foo" 
second=4 

我認爲boost :: wave支持宏重新掃描和查找。有什麼我不知道的,還是我需要做一些處理鉤子來使擴展發生?我的意思是,我可以編寫代碼來下降樹,但如果我錯過了一些重要的東西,如果我不必做那項工作,那肯定會很好。

+0

我想你meant'#定義STR(S)#s''#定義XSTR(S)STR(S)' –

+1

你可以在路上重新定義或取消定義'str',但'firsr'仍然必須展開爲'str(foo)'。這就是爲什麼它不能被完全展開。 –

+0

啊。這是有道理的。爲了得到一個宏的評價,我必須在某個地方使用它,例如'char const firstdef [] = first;''const const secondeval = second;'' –

回答

0

n.m.的線索很重要。宏可以在任何時候定義和定義,所以它只是相關的使用實例。

這比我預想的要容易得多。如果我在頭文件中有這樣的內容:

#define str(s) #s 
#define xstr(s) str(s) 
... 
#define MAJORVER 1 
#define MINORVER 0 
#define MAJORBUILD 0 
#define MINORBUILD 1 
#define FULLBUILDSTRING xstr(MAJORVER) "." \ 
         xstr(MINORVER) "." \ 
         xstr(MAJORBUILD) "." \ 
         xstr(MINORBUILD) 

FULLBUILDSTRING宏將評估爲聲明的字符串。但是,如果我有一些代碼,直接利用宏觀的,比如在

static char const full_build_string[] = FULLBUILDSTRING; 

它將評估以下時,浪潮對其進行處理:

static char const full_build_string = "1" "." "0" "." "0" "." "1"; 

如果你需要怎麼看宏定義後處理完成,你總是可以做一些像這樣(這是從波驅動程序代碼所):

auto end = ctx.macro_names_end(); 
for (auto it = ctx.macro_names_begin(); it != end; ++it) { 
    typedef std::vector<context_type::token_type> parameters_type; 
    bool has_pars = false; 
    bool predef = false; 
    context_type::position_type pos; 
    parameters_type pars; 
    context_type::token_sequence_type def; 
    if (ctx.get_macro_definition(*it, has_pars, predef, pos, pars, def)) { 
     // if has_pars is true, you can iterate through pars to see 
     // parameters for function macros 
     // iterate through def to see the macro definition 
    } 
} 

當然,宏存儲在非擴張形式。

(納米,如果你寫一個答案,我會接受的)