あなたはundef
それを何度も繰り返すことができます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();
}
プリプロセッサは、次のようにして、上から下に 1 行ずつ進みます。
- ああ、
#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
ものはまったく使用されません。