从宏生成`#define`s

时间:2017-02-02 12:57:27

标签: c macros

// define 31:
#define f_Q31(x)                      f_Q(31,x)
#define q31_F(x)                      q_F(31,x)
#define CHECK_Q31(q,def)              CHECK_Q(31,q,def)
// define 25:
#define f_Q25(x)                      f_Q(25,x)
#define q25_F(x)                      q_F(25,x)
#define CHECK_Q25(q,def)              CHECK_Q(25,q,def)
// etc.

以上可以概括,如下:

#define SUPPORT_TYPE(N) something?

添加新类型将是一行:

#define SUPPORT_TYPE_Q31   SUPPORT_TYPE(31)
#define SUPPORT_TYPE_Q25   SUPPORT_TYPE(25)

1 个答案:

答案 0 :(得分:3)

预处理器只有一个传递,因此您无法使用其他#define语句生成#define个语句。

你可以使用一个小脚本(令人惊讶地想到python :))做你想做的事:

text="""// define {0}:
#define f_Q{0}(x)                      f_Q({0},x)
#define q{0}_F(x)                      q_F({0},x)
#define CHECK_Q{0}(q,def)              CHECK_Q({0},q,def)
"""

for i in (25,31):
    print(text.format(i))

运行此脚本时会生成:

// define 25:
#define f_Q25(x)                      f_Q(25,x)
#define q25_F(x)                      q_F(25,x)
#define CHECK_Q25(q,def)              CHECK_Q(25,q,def)

// define 31:
#define f_Q31(x)                      f_Q(31,x)
#define q31_F(x)                      q_F(31,x)
#define CHECK_Q31(q,def)              CHECK_Q(31,q,def)