我是靠谱客的博主 俊逸黄蜂,最近开发中收集的这篇文章主要介绍c++让代码只执行一次的方式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天查找这方面的资料,然后自己简单改写了一个宏来实现:

/*** 宏函数-括号中的code代码只执行一次 ***/
#define once_run(code) {        
    static auto tmp = [&](){    
        code;                   
        return 0;               
    }();                        
    (void)tmp;                  
}

实际测试发现有几个地方要注意:

  1. lambda函数中“&”不能少,否则括号中的代码段,无法捕捉到这个函数外定义的变量;
  2. lambda函数最后的“()”不能少,否则不会对静态变量tmp进行初始化,也即code代码一次都不会执行;
  3. 最后的(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++让代码只执行一次的方式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部