You can undef
ine it and define
again:
#include <iostream>
#define AAA 13
int main()
{
#undef AAA
#define AAA 7
std::cout << AAA;
}
outputs: 7
Please note that statements that start with #
are preprocessor directives that are taken care of before the code is even compiled. In this case, this constant AAA
will be simply replaced by 7
, i.e. it works just like a textual replacement with no additional checks of syntax, no type safety etc...
...which is main reason why you should avoid using macros and #define
s where they can be replaced by static functions and variables :)
Why "textual replacement" ?
Look at this code:
#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();
}
preprocessor goes line by line from the top to the bottom, doing this:
- ah,
#define AAA 13
, so when I hit AAA
next time, I'll put there 13
- look, purePrint uses
AAA
, I'm replacing it with 13
- wait, now they tell me to use
7
, so I'll stop using 13
- so here in
redefAndPrint()
I'll put there 7
transforming the given code into this one:
#include <iostream>
void purePrint() {
std::cout << 13;
}
void redefAndPrint() {
std::cout << 7;
}
int main()
{
purePrint();
redefAndPrint();
purePrint();
}
which will output 13713
and the latest #define AAA 4
won't be used at all.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…