// где-то здесь, в коде выше, объявлен дефайн #define VALUE 1
// а вот здесь мне нужно переопределить этот дефайн с другим значением, но потом вернуться у прежнему
// я делаю так:#define PREV_VAL VALUE // запоминаю прежнее значение#define VALUE 2 // ввожу новое значение
// здесь находится код, который использует VALUE
// теперь надо вернуться к прежнему значению#define VALUE PREV_VAL // возвращаемся
// здесь должно быть старое значение (VALUE 1) [***]
Подстава в том, что в [***] нет ни старого значения, ни нового. VALUE просто undefined. Почему? И как решить эту задачу?
Компилятор GCC.
Здравствуйте, slavo, Вы писали:
S>Подстава в том, что в [***] нет ни старого значения, ни нового. VALUE просто undefined. Почему? И как решить эту задачу? S>Компилятор GCC.
В твоём подходе никак, так как внутри описания дерективы define подстановки не выполняются. Они выаполняются уже потом, в коде. Это как переменные в функциональных языках
Можешь попробовать так сделать:
#define VALUE_DEFAULT 1
#define VALUE VALUE_DEFALT
// Тут код типа какой-то#undef VALUE
#define VALUE 2
// Тут твой код#undef VALUE
#define VALUE VALUE_DEFALT
// Тут снова всё как было...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, slavo, Вы писали:
S>День добрый, есть такая проблема:
S>
S>// где-то здесь, в коде выше, объявлен дефайн #define VALUE 1
S>// а вот здесь мне нужно переопределить этот дефайн с другим значением, но потом вернуться у прежнему
S>// я делаю так:
S>#define PREV_VAL VALUE // запоминаю прежнее значение
S>#define VALUE 2 // ввожу новое значение
S>// здесь находится код, который использует VALUE
S>// теперь надо вернуться к прежнему значению
S>#define VALUE PREV_VAL // возвращаемся
S>// здесь должно быть старое значение (VALUE 1) [***]
S>
S>Подстава в том, что в [***] нет ни старого значения, ни нового. VALUE просто undefined. Почему? И как решить эту задачу? S>Компилятор GCC.
#define PREV_VAL VALUE
Не запоминает текущее значение VALUE, а говорит компилятору заменять PREV_VAL на VALUE.
Т.е. PREV_VAL будет заменятся сперва на VALUE, а потом на 2.
Чтобы сохранить / восстановить значение макроса, можно воспользоваться прагмой:
Здравствуйте, Chorkov, Вы писали:
C>Здравствуйте, slavo, Вы писали:
S>>День добрый, есть такая проблема:
S>>
S>>// где-то здесь, в коде выше, объявлен дефайн #define VALUE 1
S>>// а вот здесь мне нужно переопределить этот дефайн с другим значением, но потом вернуться у прежнему
S>>// я делаю так:
S>>#define PREV_VAL VALUE // запоминаю прежнее значение
S>>#define VALUE 2 // ввожу новое значение
S>>// здесь находится код, который использует VALUE
S>>// теперь надо вернуться к прежнему значению
S>>#define VALUE PREV_VAL // возвращаемся
S>>// здесь должно быть старое значение (VALUE 1) [***]
S>>
S>>Подстава в том, что в [***] нет ни старого значения, ни нового. VALUE просто undefined. Почему? И как решить эту задачу? S>>Компилятор GCC.
C>#define PREV_VAL VALUE C>Не запоминает текущее значение VALUE, а говорит компилятору заменять PREV_VAL на VALUE. C>Т.е. PREV_VAL будет заменятся сперва на VALUE, а потом на 2.
C>Чтобы сохранить / восстановить значение макроса, можно воспользоваться прагмой: C>
Здравствуйте, slavo, Вы писали:
S>Подстава в том, что в [***] нет ни старого значения, ни нового. VALUE просто undefined. Почему? И как решить эту задачу? S>Компилятор GCC.
Подстава в другом: в том, что макроподстановки носят "поздний" характер.
#define x yyyy
Препроцессор не анализирует, что там понаписано в yyyyy, есть в нём макросы или нет.
Это его будет волновать только в том месте, где нужно подставить x — вот там он попробует выполнить подстановку всех встретившихся в yyyyy макросов, актуальных на тот момент.
Такой подход позволяет дёшево определять рекурсивные и взаимозависимые макросы, без танцев с бубном.
Сравни на примере функций
Здравствуйте, Erop, Вы писали:
E>В твоём подходе никак, так как внутри описания дерективы define подстановки не выполняются. Они выаполняются уже потом, в коде.
E> Это как переменные в функциональных языках
Ну, не совсем. Это, скорее, нормальный порядок подстановки (call-by-name).
А в остальном — переменные как переменные. Можно переприсваивать, можно удалять (#undef).
Здравствуйте, Константин, Вы писали:
К>Почему увы? Это благо Оно сподвигает уходить от этого убожества (в смысле макросов).
наверно вам не приходилось никогда реализовывать библиотечных(массово используемых) вещей,
поэтому вы так и не любите макросы?
ниодна серьёзная библиотека, такая как boost/QT/wxWidgets и т.д не обходится без макросов.
Здравствуйте, Sni4ok, Вы писали:
К>>Почему увы? Это благо Оно сподвигает уходить от этого убожества (в смысле макросов). S>поэтому вы так и не любите макросы?
Да я не люблю макросы...
S>ниодна серьёзная библиотека, такая как boost/QT/wxWidgets и т.д не обходится без макросов.
К сожалению совсем избежать макросов достаточно сложно, иногда невозможно.
Однако, как показывает практика, очень часто макросы используются криво для решения задач, которые они решать не должны.
— MIN/MAX
— #define PI 3.1415f
— опять-же явный косяк в исходном топике
— ...
Поэтому, я только приветствую любые сложности, возникающие при работе с макросами. Это делает их менее привлекательными для работы.
>>К>Подводя итоги: >> К>Не существует универсального способа накатывать-откатывать значения макросов. Увы. >> >> А бустовские слоты?
S>А они только с целыми числами работают.
"Andrew S" <8583@users.rsdn.ru> wrote in message news:2666098@news.rsdn.ru... >>>К>Подводя итоги: >>> К>Не существует универсального способа накатывать-откатывать значения макросов. Увы. >>> >>> А бустовские слоты? > > S>А они только с целыми числами работают. > > А теперь перечитайте начальный пост
Однако универсального способа накатывать-откатывать значения макросов по-прежнему не существует. Увы.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
S>"Andrew S" <8583@users.rsdn.ru> wrote in message news:2666098@news.rsdn.ru... >>>>К>Подводя итоги: >>>> К>Не существует универсального способа накатывать-откатывать значения макросов. Увы. >>>> >>>> А бустовские слоты? >> >> S>А они только с целыми числами работают. >> >> А теперь перечитайте начальный пост
S>Однако универсального способа накатывать-откатывать значения макросов по-прежнему не существует. Увы.
В контексте данного топика я под универсальностью понимаю работу под наиболее часто используемыми препроцессорами, а никак не поддержку всех возможных вариантов подстановки. Очевидно, обсуждать сферического коня в вакууме при решении конкретной задачи смысле не имеет — опять получится флейм. А слоты для решения проблемы, поставленной автором, вполне подходит. Все, указанную тему я больше не обсуждаю .