を使用してカスタムブロックタイプを作成し、このような何か:は、することができます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";
}
。
デストラクタがすぐに呼び出されることは保証されていますか、コンパイラはそれが気になるときはいつでもオブジェクトを破棄できますか?
コンパイラが言語標準に準拠している場合は、言語標準から指示されていなければならず、プログラムは標準の方法と同じように動作しなければなりません。コンパイラが何か違うことをしたら、それは違うことをします。 –
@KerrekSB何がありますか? – DarthRubik
あなたは、オブジェクトのライフタイムがC++で何になっているのかを尋ねていますか? –