今天查找这方面的资料,然后自己简单改写了一个宏来实现:
/*** 宏函数-括号中的code代码只执行一次 ***/
#define once_run(code) { \
static auto tmp = [&](){ \
code; \
return 0; \
}(); \
(void)tmp; \
}
实际测试发现有几个地方要注意:
- lambda函数中“&”不能少,否则括号中的代码段,无法捕捉到这个函数外定义的变量;
- lambda函数最后的“()”不能少,否则不会对静态变量tmp进行初始化,也即code代码一次都不会执行;
- 最后的(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 \
} \
} \
}
如果不涉及多线程的话,用上面一个理论上似乎更好,因为不需要每次if判断。
参考文章
https://www.cnblogs.com/life2refuel/p/8283435.html
https://www.cnblogs.com/cheungxiongwei/p/13498135.html