web-dev-qa-db-ja.com

マクロ値の再定義または変更

私は現在MFC C++で書かれた既に開発されたプロジェクトに取り組んでおり、次の定義を持つ既存のマクロに関する問題に直面しています:

#define HEIGHT_TESTS 13

コード内から値を変更しようとしていますが、前処理された定義なので、それを行うことはできないと思います。 (プログラムの元の機能に影響を与える可能性があるため)元のマクロ全体を変更せずにこの問題を回避できる方法はありますか?私は特定の条件でそれを変更するつもりです。

皆に知らせるために、私は明らかに、使用するつもりである値(17)を持つ別のマクロ定義を使用して試してみましたが、そのような運はありません。

どんな助けでも大歓迎です。

16
Neophile

あなたはそれをundefineし、再び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行ずつ行ない、次のようにします。

  • ah、_#define AAA 13_なので、次回AAAを押すと、そこに_13_が配置されます
  • ルック、purePrintはAAAを使用します。これを_13_に置き換えます。
  • 待って、今は_7_を使用するように言われたので、_13_の使用を停止します
  • so redefAndPrint()ここに配置します_7_

指定されたコードを次のコードに変換します。

_#include <iostream>

void purePrint() {
    std::cout << 13;
}

void redefAndPrint() {
    std::cout << 7;
}

int main()
{
    purePrint();
    redefAndPrint();
    purePrint();
}
_

_13713_を出力し、最新の_#define AAA 4_はまったく使用されません。

31
LihO

次のようなもの:

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13
4
hmjd

#define A 2

#define B(A + 3)

#define C(B + 4)

//ここでAの値を変更します-可能ですか?

#define A(C + 6)

0
UJJAL