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