私は現在MFC C++で書かれた既に開発されたプロジェクトに取り組んでおり、次の定義を持つ既存のマクロに関する問題に直面しています:
#define HEIGHT_TESTS 13
コード内から値を変更しようとしていますが、前処理された定義なので、それを行うことはできないと思います。 (プログラムの元の機能に影響を与える可能性があるため)元のマクロ全体を変更せずにこの問題を回避できる方法はありますか?私は特定の条件でそれを変更するつもりです。
皆に知らせるために、私は明らかに、使用するつもりである値(17)を持つ別のマクロ定義を使用して試してみましたが、そのような運はありません。
どんな助けでも大歓迎です。
あなたはそれをundef
ineし、再び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
_が配置されます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
_はまったく使用されません。
次のようなもの:
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17
// Use redefined macro
// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13
#define A 2
#define B(A + 3)
#define C(B + 4)
//ここでAの値を変更します-可能ですか?
#define A(C + 6)