iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++如何实现Go的defer功能
  • 342
分享到

C++如何实现Go的defer功能

2023-06-19 12:06:24 342人浏览 八月长安
摘要

本篇内容介绍了“c++如何实现Go的defer功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Go语言中有一个关键字:defer,它的作

本篇内容介绍了“c++如何实现Go的defer功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在Go语言中有一个关键字:defer,它的作用就是延迟执行后面的函数,在资源释放方面特别有用,比如下面一段C/C++的示例代码:

void test(){FILE* fp = fopen("test.txt", "r");if (nullptr == fp)return;if (...){fclose(fp);return;}if (...){fclose(fp);return;}if (...){fclose(fp);return;}fclose(fp);}

在每一处返回之前都需要调用fclose来关闭文件句柄,中间的流程中断越多,越是容易遗漏调用fclose导致未正常关闭文件。

C++可以使用shared_ptr,auto_ptr之类的智能指针来管理分配的内存,但是像上面这种情况C++并没有现成的可使用的代码来处理。而Go语言提供了defer关键字来解决此类问题,Go可以按如下方式来写:

func test() {file, err := os.Open("test.txt")if err != nil {return}defer file.Close()if ... {return}if ... {return}if ... {return}}

只需要使用一句:

defer file.Close()

即可,Go会自动在return之后调用defer后面的函数。我们再看看下面的示例:

package mainimport ("fmt")func test() (n int, err error) {defer fmt.Println("测试1")defer fmt.Println("测试2")defer fmt.Println("测试3")return fmt.Println("test")}func main() {test()}

它的输出为:

test
测试3
测试2
测试1

C++如何实现Go的defer功能

可以看出有多个defer时,按照先进后出的方式执行的。

C++中我们可以利用析构函数来实现,而且C++的局部变量析构规则也是按照先进后出的方式执行的。为此,我们需要定义一个Defer类:

#include <functional>typedef std::function<void()> fnDefer;class Defer{public:Defer(fnDefer fn) : m_fn(fn){}~Defer(){if(m_fn)m_fn();}private:fnDefer m_fn;};

这样,前面的C++示例代码可以写成:

void test(){FILE* fp = fopen("test.txt", "r");if (nullptr == fp)return;Defer d([&](){fclose(fp);});if (...){return;}if (...){return;}if (...){return;}}

不用再在每一处返回前手动写代码关闭文件了。

但是这里还有一点不便之处就是需要手写一个lambda表达式和手动定义一个变量,这个很好解决,使用宏来处理。

#define defer1(a,b) a##b#define defer2(a, b) defer1(a, b)#define defer(expr) Defer defer2(__Defer__,__COUNTER__) ([&](){expr;})

为了方便在同一函数多处使用,定义了defer宏来给变量命不同的名,前面的代码可以改为:

void test(){FILE* fp = fopen("test.txt", "r");if (nullptr == fp)return;defer(fclose(fp));if (...){return;}if (...){return;}if (...){return;}}

这样就实用且方便得多了。下面给出完整代码以及测试用例:

#include <functional>using namespace std;typedef std::function<void()> fnDefer;class Defer{public:Defer(fnDefer fn) : m_fn(fn){}~Defer(){if(m_fn)m_fn();}private:fnDefer m_fn;};#define defer1(a,b) a##b#define defer2(a, b) defer1(a, b)#define defer(expr) Defer defer2(__Defer__,__COUNTER__) ([&](){expr;})class Test{public:void f(int i){printf("f:%d %p", i, this);}};int main(int arGC, char *argv[]){Test t;printf("test:%p", &t);defer(t.f(1));defer(t.f(2));defer(t.f(3));return 0;}

结果如下:

C++如何实现Go的defer功能

“C++如何实现Go的defer功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: C++如何实现Go的defer功能

本文链接: https://www.lsjlt.com/news/296204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++如何实现Go的defer功能
    本篇内容介绍了“C++如何实现Go的defer功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Go语言中有一个关键字:defer,它的作...
    99+
    2023-06-19
  • C++怎么实现Go的defer功能
    这篇文章主要介绍“C++怎么实现Go的defer功能”,在日常操作中,相信很多人在C++怎么实现Go的defer功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现Go的defer功能”的疑惑有所...
    99+
    2023-06-20
  • C++实现Go的defer功能(示例代码)
    在Go语言中有一个关键字:defer,它的作用就是延迟执行后面的函数,在资源释放方面特别有用,比如下面一段C/C++的示例代码: void test() { FILE* fp ...
    99+
    2024-04-02
  • Go defer的实现原理剖析
    本篇内容介绍了“Go defer的实现原理剖析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 前言de...
    99+
    2024-04-02
  • C#如何实现Listbox自绘功能
    小编给大家分享一下C#如何实现Listbox自绘功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用控件的DrawMode属性来实现控件的自绘,首先将C# Listbox的DrawMode设置为OwnerDrawVari...
    99+
    2023-06-17
  • C++如何实现通讯录功能
    这篇文章主要介绍“C++如何实现通讯录功能”,在日常操作中,相信很多人在C++如何实现通讯录功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++如何实现通讯录功能”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-02
  • C#中如何实现登录功能
    这篇文章主要介绍了C#中如何实现登录功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 准备工作新建一个数据库StudentDB-- 使用master ...
    99+
    2023-06-15
  • 如何实现C#控件数组的功能
    这篇文章主要讲解了“如何实现C#控件数组的功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现C#控件数组的功能”吧!Dot.Net里取消了C#控件数组,这让习惯了使用VB控件的程序员...
    99+
    2023-06-18
  • 如何利用go语言实现智能合约的功能
    在Go语言中实现智能合约的功能可以使用Solidity库来编写智能合约代码,并使用Go语言编写合约的部署和调用代码。以下是一个简单的...
    99+
    2023-10-12
    Go语言
  • C++如何实现TCP聊天室功能
    小编给大家分享一下C++如何实现TCP聊天室功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下TCPServer.cpp:// TCPSer...
    99+
    2023-06-20
  • C#如何实现收发邮件功能
    这篇“C#如何实现收发邮件功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#如何实现收发邮件功能”文章吧。一、服务端&n...
    99+
    2023-06-30
  • C#如何实现图片轮播功能
    本篇内容介绍了“C#如何实现图片轮播功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果代码public partial&nbs...
    99+
    2023-07-04
  • C#如何实现语音播报功能
    这篇文章主要介绍“C#如何实现语音播报功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#如何实现语音播报功能”文章能帮助大家解决问题。环境:window10vs2019 16.5.5.netfr...
    99+
    2023-06-29
  • C++如何实现通讯录小功能
    这篇文章主要介绍“C++如何实现通讯录小功能”,在日常操作中,相信很多人在C++如何实现通讯录小功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++如何实现通讯录小功能”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-02
  • 如何在Vue中实现Svelte的Defer Transition
    最近观看了Rich Harris的<Rethinking Reactivity>视频,惊叹于Svelte框架的高效同时,还发现了Vue所不具备的一些关于动画的原生支持—d...
    99+
    2024-04-02
  • go-cqhttp智能聊天功能的实现
    目录智能聊天一、 概述二、 使用方法三、 接入程序四、 智能群聊智能聊天 一、 概述 我们将我们的qq聊天机器人的环境配置好后,其就可以开始接收消息啦!那么,我们除了可以接收特定的消...
    99+
    2024-04-02
  • 如何实现vsftpd的功能
    这篇文章给大家分享的是有关如何实现vsftpd的功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、如何实现虚拟路径比如:/home/a 映射为 ftp://localhost/a/home/b/c 则为 ft...
    99+
    2023-06-16
  • C#如何实现文字转语音功能
    本文小编为大家详细介绍“C#如何实现文字转语音功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#如何实现文字转语音功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果图关键是,c#有现成的一个引用右键点击...
    99+
    2023-06-29
  • C++如何实现简易通讯录功能
    这篇文章主要讲解了“C++如何实现简易通讯录功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++如何实现简易通讯录功能”吧!实现功能提示:这里可以添加本文要记录的大概内容:通过c++语法...
    99+
    2023-07-02
  • GO语言中如何实现Linux系统的LOAD功能?
    在Linux系统中,我们常常会使用LOAD命令来查看当前系统的负载情况。那么在GO语言中,我们该如何实现这个功能呢?本文将为大家介绍GO语言中如何实现Linux系统的LOAD功能,同时演示一些相关的代码。 一、什么是LOAD? 在介绍如何...
    99+
    2023-10-19
    关键字 load linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作