2017-02-02 6 views
1
// 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`s от макро

#define SUPPORT_TYPE(N) something? 

Добавление нового типа бы тогда одна строка:

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

препроцессор делает только 1 так что вам придется искать другой путь. –

+0

Почему все макро магия? недостаточно ли встроенных функций? –

+0

@KamiKaze Это очень длинная история ... :-( – Danijel

ответ

3

Препроцессор имеет только один проход, поэтому вы не можете генерировать операторы #define с другими операциями #define.

Вы можете использовать небольшой скрипт (питон приходит на ум, удивительно :)) делать то, что вы хотите:

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) 
+2

Согласен. И, @Danijel, есть много [больше альтернатив] (https://stackoverflow.com/q/396644/2877364), если вам нужно больше строительных лесов, включая [мой личный фаворит] (https://stackoverflow.com/a/ 15027444/2877364) :). – cxw