Временно сохранить значение #define
От: slavo  
Дата: 20.09.07 11:58
Оценка:
День добрый, есть такая проблема:


// где-то здесь, в коде выше, объявлен дефайн #define VALUE 1

// а вот здесь мне нужно переопределить этот дефайн с другим значением, но потом вернуться у прежнему
// я делаю так:

#define PREV_VAL VALUE // запоминаю прежнее значение
#define VALUE 2 // ввожу новое значение

// здесь находится код, который использует VALUE

// теперь надо вернуться к прежнему значению

#define VALUE PREV_VAL // возвращаемся

// здесь должно быть старое значение (VALUE 1) [***]


Подстава в том, что в [***] нет ни старого значения, ни нового. VALUE просто undefined. Почему? И как решить эту задачу?
Компилятор GCC.
Re: Временно сохранить значение #define
От: Erop Россия  
Дата: 20.09.07 12:21
Оценка:
Здравствуйте, 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
// Тут снова всё как было...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Временно сохранить значение #define
От: Chorkov Россия  
Дата: 20.09.07 12:29
Оценка:
Здравствуйте, 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.

Чтобы сохранить / восстановить значение макроса, можно воспользоваться прагмой:
#pragma push_macro("macro_name")
#pragma pop_macro("macro_name")

(MS specific)
Re[2]: Временно сохранить значение #define
От: slavo  
Дата: 20.09.07 12:32
Оценка:
Здравствуйте, 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>
C>#pragma push_macro("macro_name")
C>#pragma pop_macro("macro_name")
C>

C>(MS specific)

Это интересно, но компилятор GCC
Re: Временно сохранить значение #define
От: Кодт Россия  
Дата: 20.09.07 13:16
Оценка:
Здравствуйте, slavo, Вы писали:

S>Подстава в том, что в [***] нет ни старого значения, ни нового. VALUE просто undefined. Почему? И как решить эту задачу?

S>Компилятор GCC.

Подстава в другом: в том, что макроподстановки носят "поздний" характер.
#define x yyyy

Препроцессор не анализирует, что там понаписано в yyyyy, есть в нём макросы или нет.
Это его будет волновать только в том месте, где нужно подставить x — вот там он попробует выполнить подстановку всех встретившихся в yyyyy макросов, актуальных на тот момент.

Такой подход позволяет дёшево определять рекурсивные и взаимозависимые макросы, без танцев с бубном.
Сравни на примере функций
void foo(); // потребовалось предварительное объявление
void bar() { .... foo(); .... }
void foo() { .... bar(); .... }

struct foobar // а в объявлении класса - не потребовалось
{
    void foo() { .... bar(); .... }
    void bar() { .... foo(); .... }
};


Подводя итоги:
Не существует универсального способа накатывать-откатывать значения макросов. Увы.
MS-specific #pragma push_macro
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Временно сохранить значение #define
От: Кодт Россия  
Дата: 20.09.07 13:16
Оценка:
Здравствуйте, Erop, Вы писали:

E>В твоём подходе никак, так как внутри описания дерективы define подстановки не выполняются. Они выаполняются уже потом, в коде.


E> Это как переменные в функциональных языках


Ну, не совсем. Это, скорее, нормальный порядок подстановки (call-by-name).
А в остальном — переменные как переменные. Можно переприсваивать, можно удалять (#undef).
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Временно сохранить значение #define
От: Константин Россия  
Дата: 20.09.07 13:42
Оценка: :))
Здравствуйте, Кодт, Вы писали:

К>Не существует универсального способа накатывать-откатывать значения макросов. Увы.


Почему увы? Это благо Оно сподвигает уходить от этого убожества (в смысле макросов).
Re[3]: Временно сохранить значение #define
От: alion  
Дата: 20.09.07 14:00
Оценка: 1 (1) +1
S>>>// а вот здесь мне нужно переопределить этот дефайн с другим значением, но потом вернуться у прежнему

А зачем это нужно? Может эту проблемму можно решить по-другому?
Re[3]: Временно сохранить значение #define
От: Sni4ok  
Дата: 20.09.07 20:38
Оценка:
Здравствуйте, Константин, Вы писали:

К>Почему увы? Это благо Оно сподвигает уходить от этого убожества (в смысле макросов).


наверно вам не приходилось никогда реализовывать библиотечных(массово используемых) вещей,
поэтому вы так и не любите макросы?
ниодна серьёзная библиотека, такая как boost/QT/wxWidgets и т.д не обходится без макросов.
Re[4]: Временно сохранить значение #define
От: Константин Россия  
Дата: 21.09.07 08:32
Оценка:
Здравствуйте, Sni4ok, Вы писали:

К>>Почему увы? Это благо Оно сподвигает уходить от этого убожества (в смысле макросов).

S>поэтому вы так и не любите макросы?
Да я не люблю макросы...

S>ниодна серьёзная библиотека, такая как boost/QT/wxWidgets и т.д не обходится без макросов.

К сожалению совсем избежать макросов достаточно сложно, иногда невозможно.
Однако, как показывает практика, очень часто макросы используются криво для решения задач, которые они решать не должны.
— MIN/MAX
— #define PI 3.1415f
— опять-же явный косяк в исходном топике
— ...
Поэтому, я только приветствую любые сложности, возникающие при работе с макросами. Это делает их менее привлекательными для работы.
Re[2]: Временно сохранить значение #define
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.09.07 11:29
Оценка:
К>Подводя итоги:
К>Не существует универсального способа накатывать-откатывать значения макросов. Увы.

А бустовские слоты?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Временно сохранить значение #define
От: Sergey Россия  
Дата: 21.09.07 11:39
Оценка:
>К>Подводя итоги:
> К>Не существует универсального способа накатывать-откатывать значения макросов. Увы.
>
> А бустовские слоты?

А они только с целыми числами работают.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Временно сохранить значение #define
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.09.07 12:01
Оценка:
>>К>Подводя итоги:
>> К>Не существует универсального способа накатывать-откатывать значения макросов. Увы.
>>
>> А бустовские слоты?

S>А они только с целыми числами работают.


А теперь перечитайте начальный пост
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Временно сохранить значение #define
От: Sergey Россия  
Дата: 21.09.07 12:18
Оценка:
"Andrew S" <8583@users.rsdn.ru> wrote in message news:2666098@news.rsdn.ru...
>>>К>Подводя итоги:
>>> К>Не существует универсального способа накатывать-откатывать значения макросов. Увы.
>>>
>>> А бустовские слоты?
>
> S>А они только с целыми числами работают.
>
> А теперь перечитайте начальный пост

Однако универсального способа накатывать-откатывать значения макросов по-прежнему не существует. Увы.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Временно сохранить значение #define
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.09.07 12:46
Оценка:
S>"Andrew S" <8583@users.rsdn.ru> wrote in message news:2666098@news.rsdn.ru...
>>>>К>Подводя итоги:
>>>> К>Не существует универсального способа накатывать-откатывать значения макросов. Увы.
>>>>
>>>> А бустовские слоты?
>>
>> S>А они только с целыми числами работают.
>>
>> А теперь перечитайте начальный пост

S>Однако универсального способа накатывать-откатывать значения макросов по-прежнему не существует. Увы.


В контексте данного топика я под универсальностью понимаю работу под наиболее часто используемыми препроцессорами, а никак не поддержку всех возможных вариантов подстановки. Очевидно, обсуждать сферического коня в вакууме при решении конкретной задачи смысле не имеет — опять получится флейм. А слоты для решения проблемы, поставленной автором, вполне подходит. Все, указанную тему я больше не обсуждаю .
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.