2015-05-28 64 views
1

有沒有辦法在標記之前強制預處理器完全評估符號?Force Preprocessor Evaluation Tokenizing

我想要的輸入和輸出示例GFR_SER_##token,GFR_SER_INT

作爲一個例子,我試圖用Boost :: PP做一些預處理器元編程。

粘貼的字符串,它很容易,你只需添加一個水平間接的,如:

#define str(s) xstr(s) 
#define xstr(s) #s 

然而,這不適用於符號化工作,爲#define xtkz(t) ##t是非法的,由於在一開始的標記語法的表達。

我使用BOOST_PP_IDENTIFY(s),它解決了輸入試過,但不幸的是導致升壓呼叫如GFR_SER_BOOST_PP_IDENTIFY(s)的標記化。這個問題有沒有很好的解決方法?

回答

2

您可以使用相同的雙擴展技術,但你必須記住,##是一個二元運算符:

#define XCONCAT(a,b) a##b 
#define CONCAT(a,b) XCONCAT(a,b) 

#define token INT 
CONCAT(GFR_SER_,token) 

運行上面通過gcc -E結果:

# 1 "<stdin>" 
# 1 "<command-line>" 
# 1 "/usr/include/stdc-predef.h" 1 3 4 
# 30 "/usr/include/stdc-predef.h" 3 4 
# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4 
# 31 "/usr/include/stdc-predef.h" 2 3 4 
# 1 "<command-line>" 2 
# 1 "<stdin>" 




GFR_SER_INT