Как задать переменное число параметров в #define?
От: Аноним  
Дата: 02.07.01 21:18
Оценка: 432 (16)
Статья:
Как задать переменное число параметров в #define?
Автор(ы): Игорь Ткачёв, Александр Шаргин
Дата: 01.04.2001


Авторы:
IT
Alexander Shargin

Аннотация:
...Пеpвое пpавило о макpосах: не использyйте их, если вы не обязаны этого делать. Пpактически каждый макpос свидетельствyет о недостатке в языке пpогpаммиpования, пpогpамме или пpогpаммисте...
Евангелие от Стpаyстpyпа, 7.8.
Можно ли написать такой макрос?
От: ooooo  
Дата: 30.11.01 08:43
Оценка:
Можно ли написать такой макрос, что-то типа:

#define Macro(x) \
#ifdef VAR
x; \
#endif

Т.е. можно ли в #define вставить условную директиву препроцессора...
Не подскажите?
А зачем?
От: volk  
Дата: 23.08.01 06:07
Оценка:
Самое ценное на этой страничке -- "Предупреждение".
Зачем нужно применять подобные конструкции? Если это просто гимнастика для мозгов, то лучше изучить Пролог. Там подобные вещи делаются постоянно, но с пользой для дела.
Тот, кто желает, но не делает, распространяет чуму.
Второй вариант - в общем случае неработоспособен
От: Андрей Тарасевич Беларусь  
Дата: 22.07.01 15:32
Оценка: 1 (1) +1
Как в C так и в C++ распознавание и удаление комментариев из исходного текста программы делается раньше (на более ранней стадии трансляции), чем макроподстановка. Компилятор не обязан распознавать и корректно обрабатывать "поздние" комментарии, возникшие в результате "хитрого" сцепления макроподстановок. В общем случае использование второго способа приведет к синтаксической ошибке.

Для конкретных компиляторов это может работать (как в случае MSVC++ 6.0). Но для других компиляторов (как и для более поздних версий MSVC++) этого гарантировать нельзя.
Best regards,
Андрей Тарасевич
Второй вариант - просто круть
От: Бетке Сергей Сергеевич Россия http://WWW.NovGARO.RU
Дата: 03.07.01 21:18
Оценка:
Да, до такого я не додумался. Может кто-нибудь уже нашёл решение и для реккурсивного использования макросов??? То есть некий макрос должен вызывать себя же, но только для "хвоста" списка аргументов, без головы. Видя приведённое выше решение не удивлюсь существованию ответа и на мой вопрос.
Re: Можно ли написать такой макрос?
От: CooLer Россия http://bestsoft.far.ru
Дата: 30.11.01 09:20
Оценка: 3 (1)
Можно наоборот

#ifdef VAR
#define Macro(x) \
x;
#else
#define Macro(x)
#endif
"Выше голову" — сказл палач, надевая петлю
Re:Второй вариант - в общем случае неработоспособе
От: Аноним  
Дата: 05.08.01 23:42
Оценка:
Вообще-то, нормальный препроцессор (описание такого есть в GNU C/C++) обязан делать макроподстановки до "девятого колена". Нет такой теории, что-бы коментарии удалять раньше макроподстановки... Кто это придумал? Сумасшедший профессор? Так ни одна книга по лексическому анализу не отражает физическую суть процесса, а используемые приемы настолько неуклюжи, что просто караул!
Т.е. если это кто-то делает -- то пожалуйста. А в MSVC++ лучший препроцессор (немного уступающий, только в одной вещице GNU и то для MSVC ненужной, из-за другого принципа генерации Debug Info)
Re:Второй вариант - в общем случае неработоспособе
От: Андрей Тарасевич Беларусь  
Дата: 16.08.01 07:42
Оценка:
А насчет "нет такой теории" — вперед к C++ International Standart раздел 2.1 Phases of translation. Это не теория, это спецификация языка C++.
Best regards,
Андрей Тарасевич
Re:Второй вариант - в общем случае неработоспособе
От: Андрей Тарасевич Беларусь  
Дата: 16.08.01 07:38
Оценка: 1 (1) +1
Во-первых, пока речь идет о языке C++, нормальным препроцессором будет такой и только такой препроцессор, который соотвествует спецификации препроцессора языка C++ сформулированной в Стандарте языка. Тут никакой дискуссии быть не может.

Во-вторых, речь идет не о препроцессоре, как таковом, а о стадиях трансляции. Препроцессор, который суется во все стадии трансляции до "девятого колена" — это действительно может придумать только сумасшедший профессор.

И, наконец, в-третьих, работоспособнось второго способа, как я уже говорил, зависит не от препроцессора, а от подхода транслятора к распознаванию комментариев. В общем случае компилятор C++ _не_ _распознает_ комментарии, возникшие после макроподстановки.
Best regards,
Андрей Тарасевич
Re: Как задать переменное число параметров в #define?
От: Bantammy  
Дата: 15.03.05 06:44
Оценка:
Мне понравился следующий способ. Несмотря на кажущуюся громоздкость, он свободен от некоторых упоминавшихся недостатков и, кроме того, может быть применён в более экзотических ситуациях...

#define _MIA_JOIN_(arg1_, arg2_) \
    arg1_ ## arg2_
#define _MIA_JOIN(arg1_, arg2_) \
    _MIA_JOIN_(arg1_, arg2_)
#define _MIA_EXPAND_0_MIA_END
#define _MIA_EXPAND_1_MIA_END
#define _MIA_EXPAND(value_) \
    value_,
#define _MIA_EXPAND_0(value_) \
    _MIA_EXPAND(value_) ## _MIA_EXPAND_1
#define _MIA_EXPAND_1(value_) \
    _MIA_EXPAND(value_) ## _MIA_EXPAND_0
#define MAKE_INT_ARRAY(name_, size_, values_) \
    int name_[size_]={_MIA_JOIN(_MIA_EXPAND_0 ## values_, _MIA_END)}

void main() {
    MAKE_INT_ARRAY(test_array, 6, (1)(2)(3)(4)(5)(6));
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.