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