今日、この情報を検索し、それを実現するためにマクロを書き直しただけです。
/*** 宏函数-括号中的code代码只执行一次 ***/
#define once_run(code) { \
static auto tmp = [&](){ \
code; \
return 0; \
}(); \
(void)tmp; \
}
実際のテストでは、注意を払うべき場所がいくつかあることがわかりました。
- ラムダ関数の「&」は省略できません。省略しないと、角かっこ内のコードセグメントが関数の外部で定義された変数をキャプチャできません。
- ラムダ関数の最後にある「()」は省略できません。省略しないと、静的変数tmpが初期化されません。つまり、コードコードが1回実行されません。
- 最後の(void)tmpは、コンパイラがアラームを発するのを防ぐためだけに効果がありません。そうでない場合は、定義された変数が使用されていないことが報告されます。
テストコード:
#include <iostream>
#include <unistd.h>
using namespace std;
#define once_run(code) { \
static auto tmp = [&](){ \
code \
return 0; \
}(); \
(void)tmp; \
}
int main(){
int a = 1;
while (1) {
once_run(a++;)
cout<<"a = "<<a<<endl;
sleep(1);
}
return 0;
}
結果:
研究ノートを保存するためにCSDNの使用を開始することを決定しました。CSDNで記事を書くのは初めてでした。
参考文献[1]は、マルチスレッド用の別のマクロを提供します。これもここに記録されています。
#define ONCE_RUN(code) { \
static int _done; \
if (!_done) { \
if (__sync_bool_compare_and_swap(&_done, 0, 1)) { \
code \
} \
} \
}
マルチスレッドが含まれていない場合は、理論的には上記のものを使用する方がよいようです。それぞれを判断する必要がないためです。
参考記事
https://www.cnblogs.com/life2refuel/p/8283435.html
https://www.cnblogs.com/cheungxiongwei/p/13498135.html