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

猜你喜欢

转载自blog.csdn.net/junh_tml/article/details/114675327