- ベストアンサー
managed(push, off) の意味
- C#を勉強し始め、アンマネージド(ネイティブ・コード)のコードを書く必要があります。
- マネージ・コードとネイティブ・コードの混在ということは理解できましたが、MSDNの「#pragma managed([push,] on | off)」の意味がよくわかりません。
- 説明が載っているHPやその説明を教えていただけないでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#pragma managed(push, on) の意味は「今のマネージのオンオフの状態を取っておいて、マネージをオンにする」と言う意味。 #pragma managed(push, off) の意味は「今のマネージのオンオフの状態を取っておいて、マネージをオフにする」と言う意味。 #pragma managed(pop) の意味は「pushで取っておいたマネージの状態に戻す」と言う意味。 どこかのコードの途中で「マネージを一時的にオンしたい」とします。 一時的にオンにした後は「元の状態に戻す必要」があります。 そして、その場所の「元の状態がオンかオフか判らない」としたら、どうしたら良いでしょう? //サンプルコード1 //この位置はオンかオフか判らない // //マネージをオンにする #pragma managed // ~~~ ~~~ //マネージを元に戻す //#pragma managed/unmanagedのどっちか判らない!元に戻せない。どうしよう? // これでは、元に戻せませんね。 //サンプルコード2 //この位置はオンかオフか判らない // //今の状態を保存して、マネージをオンにする #pragma managed(push,on) // ~~~ ~~~ //マネージを元に戻す #pragma managed(pop) // どうです?元の状態がどっちか判らなくても「元の状態」に戻せたでしょう? managedのpushとpopは、通常「インクルードファイルの中で、マネージをオンしたりオフしたりする必要がある時」に使います。 例えば、test.hppのインクルードファイル内で //マネージをオンにする #pragma managed(push,on) // ~~~ ~~~ //マネージを元に戻す #pragma managed(pop) と書きます。 test.hppは「どこで使われるか判らない」ですから、マネージがオンの場所で呼び出されたり、マネージがオフの場所で呼び出されたりします。 インクルードを呼び出す側も //マネージをオンする #pragma managed // //このtest.hppは、中でマネージを一時的にオンにしても元に戻してくれる <#include test.hpp> // //ここは「マネージがオン」のつもりで書く // #pragma unmanaged // //このtest.hppは、中でマネージを一時的にオンにしても元に戻してくれる <#include test.hpp> // //ここは「マネージがオフ」のつもりで書く // みたいになっています。 もし、test.hppの中で「マネージをオンしたまま、元に戻さなかった」としたら、困った事になります。 // #pragma unmanaged // //このtest.hppは、中でマネージをオンにしたまま戻さないという、極悪非道なファイル <#include test.hpp> // //ここのコードを「マネージがオフ」のつもりで書いても、マネージはオンになっている // どうです?「元に戻す」ってのが、如何に重要な事か、理解できましたか?
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
その下の例では不足ですか?
お礼
理解できました! 大変丁寧に教えていただきありがとうございます!! 今の状態を意識しつつ、pushとpopをうまく使ってみたいと思います。