1. 程式人生 > >類如BOOST_PP_CAT等含有##、#的巨集,需要一箇中間巨集的原因

類如BOOST_PP_CAT等含有##、#的巨集,需要一箇中間巨集的原因

在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了