Сообщений 9 Оценка 432 Оценить |
Этот способ предложил Dmitry A. Senkevich (2:5020/1300) в конференции RU.VISUAL.CPP, сорвав при этом бурные и продолжительные аплодисменты.
#define MAKE_INT_ARRAY(name,size,values) int name [size] = { values } #define _ , MAKE_INT_ARRAY (i1, 1, 1); MAKE_INT_ARRAY (i2, 2, 1 _ 2); MAKE_INT_ARRAY (i8, 8, 1 _ 2 _ 3 _ 4 _ 5 _ 6 _ 7 _ 8); #undef _ |
Естественно, не обошлось без комментариев.
В частности, Alexander Fedorov (2:5030/437.74) процитировал классика:
ПРЕДУПРЕЖДЕНИЕ ...Пеpвое пpавило о макpосах: не использyйте их, если вы не обязаны этого делать. Пpактически каждый макpос свидетельствyет о недостатке в языке пpогpаммиpования, пpогpамме или пpогpаммисте... Евангелие от Стpаyстpyпа, 7.8. |
Существует ещё один способ решить задачу, тоже довольно экзотический, зато не требует переопределения подчёрка (если наш макрос много где используется в программе, переопределение подчёрка может оказаться проблематичным, а ввод вместо него другого идентификатора значительно "портит" изначальный красивый замысел). Можно тот же макрос описать так:
#define MAKE_INT_ARRAY(name,size,values) int name [size] = { /values/ } MAKE_INT_ARRAY (i1, 1, *"*/ 1 /*"*); MAKE_INT_ARRAY (i2, 2, *"*/ 1, 2 /*"*); MAKE_INT_ARRAY (i8, 8, *"*/ 1, 2, 3, 4, 5, 6, 7, 8 /*"*); |
Недостаток - необходимость использовать окантовку *"*/ и /*"* даже если параметр один. Но кому нужен массив из одного элемента? ;)
Сообщений 9 Оценка 432 Оценить |