2016-04-16 25 views
0

を使用してカスタムブロックタイプを作成し、このような何か:は、することができますAVR-GCCでマクロ

ATOMIC_CODE{ 
    cout << "Here I can do stuff that is very time sensitive\n"; 
} 

残念ながら、これは私が避けたい特殊なGCC atributeを、使用の#defineです。

ので、回避策はこれです:唯一の問題は、それは(私が信頼できる方法であることを確認していない)すぐに呼ばれて得るデストラクタにrelysということです

void enableInterrupts(){ std::cout << "Interupts Enabled\n"; } 
void disableInterrupts() { std::cout << "Interupts Disabled\n"; } 
class Scoped{ 
    void (*cleanup)(); 
    bool incremented; 
    public: 
     Scoped(void (*clean)(),void (*before)()) : cleanup(clean),incremented(false){ 
      before(); 
     } 
     ~Scoped(){ 
      cleanup(); 
     } 
     void operator ++(){ 
      incremented = true; 
     } 
     bool operator!(){ 
      return !incremented; 
     } 

}; 
#define ATOMIC for (Scoped x(&enableInterrupts,&disableInterrupts); !x; ++x) 

//Later in main.cpp 
ATOMIC{ 
    /*do stuff*/ 
    std::cout << "This is atomic code\n"; 
} 

デストラクタがすぐに呼び出されることは保証されていますか、コンパイラはそれが気になるときはいつでもオブジェクトを破棄できますか?

+0

コンパイラが言語標準に準拠している場合は、言語標準から指示されていなければならず、プログラムは標準の方法と同じように動作しなければなりません。コンパイラが何か違うことをしたら、それは違うことをします。 –

+0

@KerrekSB何がありますか? – DarthRubik

+0

あなたは、オブジェクトのライフタイムがC++で何になっているのかを尋ねていますか? –

答えて

1

はい、デストラクタがすぐに呼び出されることが保証されています。

https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

あなたは怠惰なマークを行うと、ガベージコレクションを掃引言語を考えています。

+0

いいえ私は...デストラクタが非ポインタオブジェクト – DarthRubik

+0

自動変数はスコープから外れるとすぐにクリーンアップされます。 – xaxxon

+0

良い.......ありがとう! – DarthRubik

関連する問題