Переопределение или изменение значения макроса - PullRequest
13 голосов
/ 14 февраля 2012

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

#define HEIGHT_TESTS 13

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

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

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

Ответы [ 2 ]

29 голосов
/ 14 февраля 2012

Вы можете undef in it и define снова:

#include <iostream>

#define AAA 13

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

выходы: 7

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

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


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

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

#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 не будет использоваться вообще.

4 голосов
/ 14 февраля 2012

Примерно так:

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

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