現在的位置: 首頁 > 黃專家專欄 > 正文

奇技淫巧 – C/C++ 宏自身迭代

2014年10月30日 黃專家專欄 ⁄ 共 1924字 ⁄ 字號 評論關閉

boost 中包含了許多奇技淫巧的代碼,這里分析宏的自身迭代

以這樣的宏代碼調用

1
BOOST_PP_ENUM_PARAMS(4, typename T)

它的宏展開為

1
typename T0 , typename T1 , typename T2 , typename T3

這在boost中被多用于簡化代碼量 比如 boos::function 中

下面來分析這類宏的具體實現

宏1:

1
#define BOOST_PP_ENUM_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, param)

首先看看 BOOST_PP_ENUM_PARAMS_M 的作用

宏2:

1
#define BOOST_PP_REPEAT BOOST_PP_CAT(BOOST_PP_REPEAT_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))

由宏2,可以看出,宏1展開為

1
BOOST_PP_CAT(BOOST_PP_REPEAT_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))(count, BOOST_PP_ENUM_PARAMS_M, param)

BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4) 其實就是 1,這個是一個定值,在目前,我們不必去深究 那么, BOOST_PP_CAT 就可以展開為

1
BOOST_PP_REPEAT_1(count, BOOST_PP_ENUM_PARAMS_M, param)

BOOST_PP_REPEAT_1 是一個非常簡單的迭代宏

1
2
3
4
5
6
7
# define BOOST_PP_REPEAT_1(c, m, d) BOOST_PP_REPEAT_1_I(c, m, d)
# define BOOST_PP_REPEAT_1_I(c, m, d) BOOST_PP_REPEAT_1_ ## c(m, d)
# define BOOST_PP_REPEAT_1_0(m, d)
# define BOOST_PP_REPEAT_1_1(m, d) m(2, 0, d)
# define BOOST_PP_REPEAT_1_2(m, d) BOOST_PP_REPEAT_1_1(m, d) m(2, 1, d)
# define BOOST_PP_REPEAT_1_3(m, d) BOOST_PP_REPEAT_1_2(m, d) m(2, 2, d)
... ...

所以

1
BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, param)

展開就等于

1
2
3
4
BOOST_PP_ENUM_PARAMS_M(2, 0, param)
BOOST_PP_ENUM_PARAMS_M(2, 1, param)
... ...
BOOST_PP_ENUM_PARAMS_M(2, count - 1, param)

BOOST_PP_ENUM_PARAMS_M 自然也是一個宏

1
# define BOOST_PP_ENUM_PARAMS_M(z, n, param) BOOST_PP_COMMA_IF(n) param ## n

所以就有

1
2
BOOST_PP_ENUM_PARAMS_M(2, 0, param) // 展開 第一個參數不要, 其實這個參數被用于優化的目的
BOOST_PP_COMMA_IF(0) param ## 0

BOOST_PP_COMMA_IF 是一個這樣的宏,如果參數非0,那么打印出逗號,否則就不打印逗號

1
2
3
4
5
6
7
8
9
10
11
12
13
#define BOOST_PP_COMMA_IF(cond) BOOST_PP_IF(cond, BOOST_PP_COMMA, BOOST_PP_EMPTY)()
#define BOOST_PP_IF(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f)
#define BOOST_PP_IIF(bit, t, f) BOOST_PP_IIF_I(bit, t, f)
#define BOOST_PP_IIF_I(bit, t, f) BOOST_PP_IIF_ ## bit(t, f)
# define BOOST_PP_IIF_0(t, f) f
# define BOOST_PP_IIF_1(t, f) t
#define BOOST_PP_BOOL(x) BOOST_PP_BOOL_I(x)
# define BOOST_PP_BOOL_I(x) BOOST_PP_BOOL_ ## x
# define BOOST_PP_BOOL_0 0
# define BOOST_PP_BOOL_1 1
# define BOOST_PP_BOOL_2 1
... ...
# define BOOST_PP_BOOL_256 1

可以看出,宏多用窮舉

抱歉!評論已關閉.

奔驰宝马破解版下载 吉林十一选五今天推荐号码 私募股权基金配资 上海天天彩选4技巧 北京期货配资网 江西快三下载平台 江西怏3基本走势图 大西洋股票最新消息 湖北快三下载官网 江西体彩多乐彩开奖结果查询 股票市场行情 广东十一选五前三遗漏数据 策略盈配资 搜索广西新快3开奖结果 股票指数是怎么计算出来的 江苏快三号码开奖 广东快乐10分助手下载