Понадобилось тут мне сделать одну вещь на препроцессоре.
Быстро понял, что дальше примитивных ifdef особо ничего не знаю.
Заглянул ради интереса в Boost, увидел такой макрос
Здравствуйте, okman, Вы писали:
O>Только без Boost.PP — там разобраться может только маньяк.
Без Boost.PP трудно писать кросс-платформенный код (на макросах) — например потому что у MSVC много багов в препроцессоре, и тот код который работает на MSVC может быть некорректным с точки зрения ISO и не работать GCC.
Boost.PP выступает в роли абстракции от конкретного препроцессора, разруливая implementation-specific проблемы под капотом.
Здравствуйте, okman, Вы писали:
O>В общем, можете посоветовать какой-нибудь интересный материальчик по теме ? O>Только без Boost.PP — там разобраться может только маньяк.
а в чем ты собрался разбираться? в использовании он (BOOST_PP) достаточно прост по большей части, доки вполне себе понятные...
или ты хочешь написать свой аналог??
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Без Boost.PP трудно писать кросс-платформенный код (на макросах)
Речь не идет о написании кросс-платформенного кода, просто хотелось бы
лучше понять, как работают некоторые вещи. Чисто для себя.
EP>у MSVC много багов в препроцессоре
Здравствуйте, okman, Вы писали:
O>В общем, можете посоветовать какой-нибудь интересный материальчик по теме ? O>Только без Boost.PP — там разобраться может только маньяк.
Хм. Всегда считал BOOST.PP простой и удобной библиотекой. В код BOOST.PP не заглядывал, т.к. без надобности.
Здравствуйте, okman, Вы писали:
O>Здравствуйте, zaufi, Вы писали:
Z>>или ты хочешь написать свой аналог??
O>Хотел бы научиться с помощью препроцессора преодолевать некоторые ограничения самого С++. O>Как это делается в Boost.
повтыкай в tutorial, попробуй решить какую-нить свою "жизненную" задачу (например наделать шаблонных врапперов чего-либо с параметрами от 1 до MY_LIB_MAX_ARGS) -- этого вполне достаточно, чтобы покрыть большую часть необходимостей
Здравствуйте, okman, Вы писали:
O>Хотел бы научиться с помощью препроцессора преодолевать некоторые ограничения самого С++. O>Как это делается в Boost.
Boost.PP — не так сложен в использовании как это кажется. Для понимания как это работает — в еклипс цдт — есть возможность пошагового разбора вывода макросов — единственная киллер фича там, ИМХО.
Здравствуйте, okman, Вы писали:
EP>>у MSVC много багов в препроцессоре O>Например ?
#include <iostream>
using namespace std;
int main(int argc,char *argv[])
{
#define IGNORE_SECOND_E(x, _) x
#define IGNORE_SECOND(x) IGNORE_SECOND_E(x)
#define FIRST(x) x, DUMMY
#define HEAD(sequence) IGNORE_SECOND(FIRST sequence)
std::cout << HEAD((42)(11));
}
Такой код компилируется и запускается на GCC и Clang, но не компилируется на MSVC.
Если же взять BOOST_PP_SEQ_HEAD или BOOST_PP_SEQ_FOR_EACH — то такой код будет работать везде, так как уже содержит необходимые костыли.
Здравствуйте, okman, Вы писали:
O>Заглянул ради интереса в Boost, увидел такой макрос
Он тебе не нужен. Просто пользуйся.
O>В общем, можете посоветовать какой-нибудь интересный материальчик по теме ?
Доки Boost.PP.
O>Только без Boost.PP — там разобраться может только маньяк.
Тебе не надо разбираться в его потрохах. Просто пользуйся.
ЗЫ Тебе правда надо знать, как в Boost.PP объехали какую-нть кривизну MSVC6 или SunCC4 или еще какой-нть мамонтовой мути типа gcc 2.95? Нафига? Просто пользуйся, там простой и понятный интерфейс.
Здравствуйте, jazzer, Вы писали:
J>ЗЫ Тебе правда надо знать, как в Boost.PP объехали какую-нть кривизну MSVC6 или SunCC4 или еще какой-нть мамонтовой мути типа gcc 2.95? Нафига? Просто пользуйся, там простой и понятный интерфейс.
Хочу научиться эффективно использовать препроцессор.
Не для того, чтобы лепить где попало, а чтобы обходить некоторые ограничения языка.
Например, хотелось бы иметь свой легковесный аналог Scope Exit, под один конкретный
компилятор и платформу (Visual C++). Сделал попытку написать нечто подобное — не вышло
(из-за ограничений, связанных с использованием локальных классов). Попытался "подсмотреть",
как сделано в Boost — увидел там монстрообразную конструкцию, которая расширяется в не
менее монстрообразный набор темплейтов.
Вопрос в том и состоит — где бы найти материал, в котором описывались бы типовые
препроцессорные "трюки". Чтобы освоить это без погружения с головой в исходники Boost.PP.
Z>>или ты хочешь написать свой аналог??
O>Хотел бы научиться с помощью препроцессора преодолевать некоторые ограничения самого С++. O>Как это делается в Boost.
boost::preprocessor уже заточен на массу компиляторов с их особенностями и кривулями.
Если тебе хочется "научиться с помощью препроцессора преодолевать некоторые ограничения самого С++" то тебе по сути прийдется нагородить массу макросов саомстоятельно что по сути равно, написать самому часть boost pp, возможно с багами, возможно с дальнейшим переписыванием внезапно под новый компилятор.
Отладка препроцессора не такая уж удобная штука.
Для развлечения, можно просто подсмотреть как реализованы те или инные части (я например так делал когда выполнял тестовое задание в ESET), но не более того.
В реальном проекте я просто беру библиотеки boost и благодарю тех ребят которые его поддерживают.
Напрямую — не знаю. Может, у него реализация должна была использовать подобные возможности. Просто это единственное известное мне ограничение MSVC в данном плане.
я правильно понимаю что scope(exit) выполнится при любом раскладе scope(success) если выход из скопа не вследствии исключения и scope(failure) вылетаем по исключению ? и еще почему такой ништяк не включат в boost ?