2017-04-14 4 views
0

静的変数がC言語で宣言されているファイルを変更せずにファイル外に静的変数を更新します。静的変数をC内の別のファイルから更新します

Proj1がdllを作成します。 PROJ1はabc.hファイルを持っており、それは以下のように定義されます。

static BOOl stvar = False;//declared as global static variable 

func1() 
{ 
    stvar= TRUE; 
} 

func2() 
{ 
    if(stvar == TRUE) 
    { 
     .... 
    } 
    else 
    { 
     func1(); //call to func1 sets STVAR = TRUE; 
    } 
} 

Proj2は、exeファイルを作成します。それは​​ファイルを持っています。次のように​​ファイルが定義されています

cprogfunc1() 
{ 
    func2(); //call to func2 sets STVAR = TRUE; 
} 

cprogfunc2() 
{ 
    stvar = FALSE; 
    func2(); 
} 

我々はそれがABCのfunc2()にelseブロックを実行させるためのcprogfunc2()にfalseにstvarを設定しています。 h file。しかし、cprogfunc2()に​​の値を設定した場合、abc.hファイルに反映されません。 proj1の下には何も変更できないので、宣言の外側で静的変数を更新しています。ですから、​​ファイルから静的変数を更新するには、abc.h/Proj1を変更せずにいくつかの方法を提案してください。それができない場合は、回避策を提案してください。ありがとう。すでに試した

ソリューション: - ことはできません私たちは、ポインタを使用してabc.hファイル

  • を変更することはできませんので、 -

    1. stvar非静的を作るには定義によって
  • +0

    、コードのフォーマットコードをarne'tもののために使用しないでくださいあなたの質問は非常に明確ではありません、どのファイルがどのファイルにどのようにコンパイルされているかを明示的に示します –

    +0

    2つの異なる.exeプログラムが静的変数を共有できるかどうかを尋ねる場合は、そうではありません。 –

    答えて

    0

    を動作しませんでした、stvarは静的ましたアクセシビリティを制限するためには、外部からそれを操作する理想的な方法は、APIを作成することです(または静的ではなくグローバルにする)。 Proj1の編集は問題になっていないので、私たちは悪い状況に陥っています。あなたは何ができるか

    が言及として、DLLを解放して、もう一度それをロードすることによってPROJ1の状態をリセットすることですhere.

    +0

    ありがとうございます。私はDLLのハンドルを取得し、FreeLibraryに渡し、ライブラリをロードしてから静的変数を更新しようとしました。しかし、その変化はまだ保持されていません。正しい方法でやっていますか? @Ekadanta – Rash

    +0

    静的変数を実際に更新することはできません。静的ファイルが.hファイルにある場合、それはあなた自身のオブジェクトファイルがそのファイルのコピーを取得していることを意味し、ライブラリの静的変数状態に何も影響を与えません。提供される解決策は、問題のブールを希望の状態(False)にリセットすると仮定して、ライブラリを解放して再度ロードすることです。これがあなたがしたものであると確信していて、うまくいかない場合 - stvarのデフォルト状態が実際に真であり、コード内の他のいくつかの関数がそれをfalseに設定する可能性はありますか?あなたの試行をもっと共有してください。 – Ekadanta

    +0

    このように、上記は信頼できる解決策ではありません。共有オブジェクトを解放しても、OSがメモリから解放される保証はありません。再オープンすると、再初期化されないことがあります。 [ここ](https://stackoverflow.com/questions/24467404/dlclose-doesnt-really-unload-shared-object-no-matter-how-many-times-it-is-call)を参照してください。 – Ekadanta

    関連する問題