概述
今天查找这方面的资料,然后自己简单改写了一个宏来实现:
/*** 宏函数-括号中的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
最后
以上就是俊逸黄蜂为你收集整理的c++让代码只执行一次的方式的全部内容,希望文章能够帮你解决c++让代码只执行一次的方式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复