Переопределение или изменение значения макроса

В настоящее время я работаю над уже разработанным проектом, написанным на MFC C++, и столкнулся с проблемой с уже существующим макросом, имеющим определение:

#define HEIGHT_TESTS 13

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

Просто чтобы все знали, я, очевидно, пытался использовать другое определение макроса со значением (17), которое я намереваюсь использовать, но безуспешно.

Любая помощь приветствуется.


person Neophile    schedule 14.02.2012    source источник
comment
Я бы порекомендовал иметь другой макрос для ваших целей, а не #undefining и переопределение его.   -  person Ajay    schedule 14.02.2012
comment
Обратите внимание, что вы не сможете сохранить существующее значение и восстановить его, если вам нужно восстановить. Единственным способом для вас будет переопределить макрос с помощью 13, что, очевидно, является жестко запрограммированным значением. Что касается ответов, у вас уже есть 2 ниже, которые являются правильными.   -  person Alexis Wilke    schedule 14.02.2012
comment
Пробовал использовать другой макрос, но ничего не вышло. Программа вылетает. Только когда я изменяю это конкретное значение #define, оно дает мне правильный результат (а не тот результат, который я намереваюсь получить с этим конкретным условием).   -  person Neophile    schedule 14.02.2012


Ответы (2)


Вы можете undefпройти его и define еще раз:

#include <iostream>

#define AAA 13

int main()
{
    #undef AAA
    #define AAA 7
    std::cout << AAA;
}

выходы: 7

Обратите внимание, что операторы, начинающиеся с #, являются директивами препроцессора, которые обрабатываются еще до компиляции кода. В этом случае эта константа AAA будет просто заменена на 7, т.е. работает как текстовая замена без дополнительных проверок синтаксиса, безопасности типов и т.д...

... это основная причина, по которой вам следует избегать использования макросов и #define, где их можно заменить статическими функциями и переменными :)


Почему "текстовая замена"?

Посмотрите на этот код:

#include <iostream>

#define AAA 13

void purePrint() {
    std::cout << AAA;
}

void redefAndPrint() {
    #undef AAA
    #define AAA 7
    std::cout << AAA;
}

int main()
{
    #undef AAA
    #define AAA 4
    purePrint();
    redefAndPrint();
    purePrint();
}

препроцессор идет построчно сверху вниз, делая так:

  • а, #define AAA 13, поэтому, когда я в следующий раз нажму AAA, я поставлю 13
  • смотрите, purePrint использует AAA, я заменяю его на 13
  • Подождите, теперь мне говорят использовать 7, так что я перестану использовать 13
  • так что здесь, в redefAndPrint(), я поставлю туда 7

преобразование данного кода в этот:

#include <iostream>

void purePrint() {
    std::cout << 13;
}

void redefAndPrint() {
    std::cout << 7;
}

int main()
{
    purePrint();
    redefAndPrint();
    purePrint();
}

который выведет 13713, а последний #define AAA 4 вообще не будет использоваться.

person LihO    schedule 14.02.2012
comment
Итак, мы можем снова использовать #undef и #define в любом месте программы? - person Neophile; 14.02.2012
comment
@Nerds.Dont.Swear : Да. И когда вы вызываете #undef AAA, вам даже не нужно беспокоиться о том, был ли AAA определен ранее. - person LihO; 14.02.2012
comment
@Nerds.Dont.Swear : Да, это опечатка ;) - person LihO; 14.02.2012
comment
Этот ответ очень сбивает с толку. Кто-то думал, что можно переопределить макрос во время выполнения. - person Iharob Al Asimi; 25.03.2015
comment
@iharob: В этом ответе ничего не говорится о том, что делать во время выполнения. Я не понимаю вашей точки зрения. - person LihO; 25.03.2015
comment
Точно, это моя точка зрения, кто-то думал, что может undef и define макрос вроде if (someCondition) {#undef macro #define macro newValue}, и они утверждали, что этот пост сказал им, что это возможно. Хотя в посте об этом не говорится, он не предостерегает от этого, и, возможно, это хорошая идея, чтобы улучшить его. - person Iharob Al Asimi; 25.03.2015
comment
Я думаю, вы поступили правильно, исправив этот старый пост, потому что он полезен. Спасибо. - person Iharob Al Asimi; 28.03.2015
comment
@iharob: Нет проблем :) - person LihO; 06.04.2015
comment
Вы не должны отступать от этих директив PP. Это заставляет их выглядеть так, как будто они находятся в области действия функции, но препроцессор не имеет никакого понятия о области действия. - person S.S. Anne; 15.01.2020

Что-то вроде следующего:

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13
person hmjd    schedule 14.02.2012