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