You can undefine 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 #defines 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 hitAAAnext time, I’ll put there13 - look, purePrint uses
AAA, I’m replacing it with13 - wait, now they tell me to use
7, so I’ll stop using13 - so here in
redefAndPrint()I’ll put there7
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.