2015-06-27 2 views
0

У меня есть три списка с целыми переменными (ilist), один с двойными переменными (dlist) и один с std :: string variables (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); 

я могу использовать импульс (повышение :: препроцессор) в этом проект.

+2

Почему бы вам просто не использовать массивы для этого? Я имею в виду, вместо этого взломать это вместе через препроцессор? –

+0

Да, это очень возможно, если n достаточно мало (256, я думаю). – chris

ответ

0

Когда я только начинал программировать, я всегда искал способы быстрого и безопасного определения множества аналогичных переменных. Теперь я понимаю, что почти всегда лучше использовать массив, 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 или два действительно.

+0

Краска кода в макросах немного вводит в заблуждение - остальная часть строки не закомментирована! –

+0

hdijohkem, это вам поможет? Получаю ли я комментарий/верхний/принятый ответ? –

+0

Спасибо, это очень помогает. : D – hdijohkem