23

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

#define HEIGHT_TESTS 13

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

みんなに知らせるために、使用するつもりの値 (17) で別のマクロ定義を使用してみましたが、うまくいきませんでした。

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

4

2 に答える 2

47

あなたは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ものはまったく使用されません。

于 2012-02-14T09:35:56.610 に答える
5

次のようなもの:

#undef HEIGHT_TESTS
#define HEIGHT_TESTS 17

// Use redefined macro

// Restore
#undef HEIGHT_TESTS
#define HEIGHT_TESTS 13
于 2012-02-14T09:35:12.667 に答える