-2

コードのある時点で値を変更する定義を条件付きで使用できるかどうか疑問に思っていました。基本的には次のようなものです:

//////////////////////////////////////////// SomeFile.cpp
#define SHUTDOWN false

while(window->isOpen())
{
    if(SHUTDOWN)
        window->close();
    // Rest of the main loop
}

//////////////////////////////////////////// SomeOtherFile.cpp

if(Escape.isPressed())
{
    #undef SHUTDOWN
    #define SHUTDOWN true
}

したがって、アプリが閉じます。そうでない場合は、次のような機能があります

RenderWindow* getWindow()
{
    return window;
}

そして呼び出す

if(Escape.isPressed())
    getWindow()->close();

それを行う最良の方法は?キーイベントを呼び出しているクラスはメインループとウィンドウを制御するクラスのメンバーであるため、そのルートには行きたくないので、 getWindow( ) より複雑な方法のように思えます。しかし、プリプロセッサ ディレクティブでそれができない場合は、親クラスへのポインタを使用する必要があります。

4

2 に答える 2

0

プリプロセッサ シンボルの使用を誤解しています。プリプロセッサ コードは、c/c++ コードと絡み合った別のコードと考えてください。コンパイル時にプリプロセッサ コードが実行され、その実行によってソース コードが生成され、コンパイラによってバイナリに変換されます。プリプロセッサ シンボルは存在しない (コンパイルされてしまった) ため、実行時に使用することはできません。あなたがしていることで、グローバルスコープの変数を使用したいと思うかもしれません。

于 2013-11-08T16:15:51.293 に答える
0

プリプロセッサ条件は、コンパイルの最初の前処理段階での条件のみです。

コンパイルのそのフェーズが完了すると、マクロ (#define 値) は事実上インスタンスに置き換えられます。

あなたが書くとき

if (SHUTDOWN)

次に、コンパイラが認識するのは、前処理が完了し、コンパイルが適切に開始された時点での「SHUTDOWN」の値です。そう

#define SHUTDOWN true
if (SHUTDOWN)

にコンパイルします

if (true)

一方

#define SHUTDOWN

if (SHUTDOWN)

として、コンパイルに失敗します

if ()

変数を解決するために SHUTDOWN を #define する場合は、実行時に変数が変更される可能性があるため、これは絶対に可能です。しかし、定数はそうではありません。

于 2013-11-08T16:23:05.240 に答える