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

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

#define HEIGHT_TESTS 13

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

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

Любая помощь будет высоко оценена.

Ответ 1

Вы можете 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();
}
Препроцессор

выводит строку за строкой сверху вниз, делая это:

  • ah, #define AAA 13, поэтому, когда я нажму AAA в следующий раз, поставлю туда 13
  • look, 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 не будет использоваться вообще.

Ответ 2

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

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13

Ответ 3

#define A 2

#define B (A + 3)

#define C (B + 4)

//Я хочу здесь изменить значение A - возможно?

# определить A (C + 6)