Аннотация:
...Пеpвое пpавило о макpосах: не использyйте их, если вы не обязаны этого делать. Пpактически каждый макpос свидетельствyет о недостатке в языке пpогpаммиpования, пpогpамме или пpогpаммисте...
Евангелие от Стpаyстpyпа, 7.8.
Самое ценное на этой страничке -- "Предупреждение".
Зачем нужно применять подобные конструкции? Если это просто гимнастика для мозгов, то лучше изучить Пролог. Там подобные вещи делаются постоянно, но с пользой для дела.
Тот, кто желает, но не делает, распространяет чуму.
Как в C так и в C++ распознавание и удаление комментариев из исходного текста программы делается раньше (на более ранней стадии трансляции), чем макроподстановка. Компилятор не обязан распознавать и корректно обрабатывать "поздние" комментарии, возникшие в результате "хитрого" сцепления макроподстановок. В общем случае использование второго способа приведет к синтаксической ошибке.
Для конкретных компиляторов это может работать (как в случае MSVC++ 6.0). Но для других компиляторов (как и для более поздних версий MSVC++) этого гарантировать нельзя.
Да, до такого я не додумался. Может кто-нибудь уже нашёл решение и для реккурсивного использования макросов??? То есть некий макрос должен вызывать себя же, но только для "хвоста" списка аргументов, без головы. Видя приведённое выше решение не удивлюсь существованию ответа и на мой вопрос.
Вообще-то, нормальный препроцессор (описание такого есть в GNU C/C++) обязан делать макроподстановки до "девятого колена". Нет такой теории, что-бы коментарии удалять раньше макроподстановки... Кто это придумал? Сумасшедший профессор? Так ни одна книга по лексическому анализу не отражает физическую суть процесса, а используемые приемы настолько неуклюжи, что просто караул!
Т.е. если это кто-то делает -- то пожалуйста. А в MSVC++ лучший препроцессор (немного уступающий, только в одной вещице GNU и то для MSVC ненужной, из-за другого принципа генерации Debug Info)
Re:Второй вариант - в общем случае неработоспособе
Во-первых, пока речь идет о языке C++, нормальным препроцессором будет такой и только такой препроцессор, который соотвествует спецификации препроцессора языка C++ сформулированной в Стандарте языка. Тут никакой дискуссии быть не может.
Во-вторых, речь идет не о препроцессоре, как таковом, а о стадиях трансляции. Препроцессор, который суется во все стадии трансляции до "девятого колена" — это действительно может придумать только сумасшедший профессор.
И, наконец, в-третьих, работоспособнось второго способа, как я уже говорил, зависит не от препроцессора, а от подхода транслятора к распознаванию комментариев. В общем случае компилятор C++ _не_ _распознает_ комментарии, возникшие после макроподстановки.
Best regards,
Андрей Тарасевич
Re: Как задать переменное число параметров в #define?
Мне понравился следующий способ. Несмотря на кажущуюся громоздкость, он свободен от некоторых упоминавшихся недостатков и, кроме того, может быть применён в более экзотических ситуациях...