2017-02-10 87 views
6

使用C預處理器,您可以擁有某種高階宏。事情是這樣的:使用C預處理器進行嵌套宏迭代

#define ABC(f) f(a) f(b) f(c) 
#define XY(f) f(x) f(y) 

#define CODE(x) foo_ ## x 
ABC(CODE) 
#undef CODE 

#define CODE(x) bar_ ## x 
XY(CODE) 
#undef CODE 

輸出是:

foo_a foo_b foo_c 
bar_x bar_y 

有一些技巧,比如窩迭代,做這樣的事情?

#define CODE(x) foo_ ## x 
NEST(ABC, XY, CODE) 
#undef CODE 

所以輸出將是:

foo_ax foo_ay foo_bx foo_by foo_cx foo_cy 

我特別想有ABC和相互獨立的定義XY,這樣我仍然可以使用ABC單機或者也許甚至做這樣的事情:

#define CODE(x) foo_ ## x 
NEST(XY, KLMN, ABC, CODE) 
#undef CODE 

爲了記錄在案,這裏的解決方案:

#include <boost/preprocessor/seq.hpp> 

#define ABC (a) (b) (c) 
#define XY (x) (y) 

#define CODE(r, prod) BOOST_PP_CAT(foo_, BOOST_PP_SEQ_CAT(prod)) 
BOOST_PP_SEQ_FOR_EACH_PRODUCT(CODE, (ABC) (XY)) 

產量:

foo_ax foo_ay foo_bx foo_by foo_cx foo_cy 
+1

出的經驗,我可以告訴大家,只要你是在元編程與宏內心深處,你幾乎肯定創造一個糟糕的程序設計,幾乎肯定是這個問題的不正確的解決方案。 「X宏」及其各種衍生品被視爲最後的手段。你試圖解決的實際問題是什麼? – Lundin

回答