類如BOOST_PP_CAT等含有##、#的巨集,需要一箇中間巨集的原因
阿新 • • 發佈:2018-12-18
在BOOST中有個BOOST_PP_CAT的巨集定義:
#define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)
#define BOOST_PP_CAT_I(a, b) BOOST_PP_CAT_II(~, a##b)
#define BOOST_PP_CAT_II(p, res) res
相當於:#define M(a, b) a##b
那麼為什麼不直接定義為M的形式呢? 因為當巨集展開時遇到#或##時則停止展開。 如下巨集定義:
#define A 1 #defien B 2 #define A_CAT_B(a,b) a##b
A_CAT_B(1,2) => 相當於“12” A_CAT_B(A,B) =>相當於“AB”,不是“12”,因為遇到##就停止展開
而要實現 A_CAT_B(A,B) => A_CAT_B(1,2) => “12”這種,則需要再展開"12"之前將AB展開。 在中間再新增一個巨集就可以實現了
#define A 1
#defien B 2
#define A_CAT_B_T(a,b) a##b
#define A_CAT_B(a,b) A_CAT_B_T(a,b)
A_CAT_B(A,B) => A_CAT_B_T(1,2) => “12”, 在展開A_CAT_B_T之前,AB就已經被展開為12了