Препроцессор: как использовать список для определения переменных и ввода функций

У меня есть три списка: один с целочисленными переменными (ilist), один с двойными переменными (dlist) и один с переменными std::string (slist) с определенными начальными значениями. Пример: ilist=(ilist1=init_val_1)(ilist2=init_val_2)

Может ли препроцессор генерировать такой код:

int ilist1=init_val_1;
int ilist2=init_val_2;
...
int ilistn=init_val_n;

double dlist1=dnit_val_1;
double dlist2=dnit_val_2;

f(ilist1, ilist2, ilist3, ..., ilistn, dlist1, dlist2);

В этом проекте я могу использовать boost (boost::preprocessor).


person hdijohkem    schedule 27.06.2015    source источник
comment
Почему бы вам просто не использовать массивы для этого? Я имею в виду, вместо того, чтобы взломать это вместе через препроцессор?   -  person Baum mit Augen    schedule 27.06.2015
comment
Да, это вполне возможно, если n достаточно мало (я думаю, 256).   -  person chris    schedule 27.06.2015


Ответы (1)


Когда я только начинал программировать, я всегда искал способы быстро и безопасно определить множество похожих переменных. Теперь я понимаю, что почти всегда лучше использовать вместо этого массив std::array или std::vector - он гораздо более понятен и прост в использовании, даже если есть какой-то неприятный хакерский способ сделать это с препроцессором.

FWIW, это сразу пришло в голову:

#define I(x) int ilist##x=init_val_##x
I(1);
I(2);
//[...]

#undef I //to avoid accidentally using it later in the code
#define D(x) double dlist##x=dnit_val_##x;
D(1);
D(2);
#undef D 

Функциям, которым требуется множество таких переменных, почти наверняка нужен массив, std::array или std::vector, или даже два.

person Robin Hartland    schedule 27.06.2015
comment
Цвет кода в макросах немного вводит в заблуждение - остальная часть строки не закомментирована! - person Robin Hartland; 27.06.2015
comment
hdjohkem, тебе это помогает? Получу ли я комментарий/проголосовать/принятый ответ? - person Robin Hartland; 28.06.2015
comment
Спасибо, это очень помогает. :D - person hdijohkem; 28.06.2015