Сообщений 9    Оценка 432        Оценить  
Система Orphus

Как задать переменное число параметров в #define?

Авторы: Игорь Ткачёв
Александр Шаргин

Источник: RU.VISUAL.CPP
Опубликовано: 01.04.2001
Исправлено: 13.03.2005
Версия текста: 1.0

Первый способ

Этот способ предложил 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        Оценить