Как я могу принудительно заменить макрос C ++ в то время, которое я выбрал в этом случае? - PullRequest
2 голосов
/ 25 февраля 2010

Я не мог придумать лучшего способа произнести название ...

#define X(c) c
#define Y(c) X(c)
#undef X

int main(int argc,char*argv[])
{
    std::cout << Y(5) << std::endl;
    return 0;
}

Это вызывает ошибку, потому что X () не объявлен в этой области. Есть ли способ заставить Y хранить копию X (иначе, заставить подстановку макросов происходить так, как я определяю Y) так, чтобы она больше не зависела от существования X? Возможно, в boost есть что-то для препроцессора, или, может быть, есть простой способ. Идеи?

Ответы [ 3 ]

6 голосов
/ 25 февраля 2010

Препроцессор C выполняет замену текста методом грубой силы;он не имеет смысла в области видимости и не может быть использован для создания замыкания таким образом.

3 голосов
/ 25 февраля 2010

Нет, это невозможно сделать с помощью стандартного препроцессора.

Зачем вам нужно отменить определение X, прежде чем оно действительно будет использовано?

0 голосов
/ 25 февраля 2010

Нет, это невозможно.

Пользуясь некоторым программированием предварительной обработки, я понимаю необходимость: например, для BOOST_PP_FOR_EACH вы должны передавать макрос, который будет вызываться при каждом повороте цикла, и все же этот макрос полезен только локально, а затем перегружен Ваша таблица символов ... потенциально может вызвать конфликт имен.

Поскольку undef невозможно, не вызывая макрос, чтобы он не работал, общее решение состоит в том, чтобы дать макросу длинное и громоздкое имя, чтобы вы не столкнулись с риском его повторного использования. имя позже.

Boost имеет очень полезное соглашение об именах:

PROJECT_PATH_FUNCTION

Например, тот самый BOOST_PP_FOR_EACH, о котором я говорил, можно найти, включив boost/preprocessor/for_each.hpp.

Явно указав путь, вы не только помогаете людям быстро найти ваш макрос, но и избегаете столкновений, поскольку внутри файла вы можете быстро убедиться, что вы не ошиблись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...