欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C++中如何實(shí)現(xiàn)Go的defer功能

本篇內(nèi)容介紹了“C++中如何實(shí)現(xiàn)Go的defer功能”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

專(zhuān)業(yè)從事網(wǎng)站制作、網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計(jì),小程序設(shè)計(jì),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠(chéng)服務(wù),采用HTML5建站+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站設(shè)計(jì),讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過(guò)程建立專(zhuān)項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。

在Go語(yǔ)言中有一個(gè)關(guān)鍵字:defer,它的作用就是延遲執(zhí)行后面的函數(shù),在資源釋放方面特別有用,比如下面一段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);
}

在每一處返回之前都需要調(diào)用fclose來(lái)關(guān)閉文件句柄,中間的流程中斷越多,越是容易遺漏調(diào)用fclose導(dǎo)致未正常關(guān)閉文件。

C++可以使用shared_ptr,auto_ptr之類(lèi)的智能指針來(lái)管理分配的內(nèi)存,但是像上面這種情況C++并沒(méi)有現(xiàn)成的可使用的代碼來(lái)處理。而Go語(yǔ)言提供了defer關(guān)鍵字來(lái)解決此類(lèi)問(wèn)題,Go可以按如下方式來(lái)寫(xiě):

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會(huì)自動(dòng)在return之后調(diào)用defer后面的函數(shù)。我們?cè)倏纯聪旅娴氖纠?/p>

package main

import (
	"fmt"
)

func test() (n int, err error) {
	defer fmt.Println("測(cè)試1")
	defer fmt.Println("測(cè)試2")
	defer fmt.Println("測(cè)試3")
	return fmt.Println("test")
}

func main() {
	test()
}

它的輸出為:

test
測(cè)試3
測(cè)試2
測(cè)試1

C++中如何實(shí)現(xiàn)Go的defer功能

可以看出有多個(gè)defer時(shí),按照先進(jìn)后出的方式執(zhí)行的。

C++中我們可以利用析構(gòu)函數(shù)來(lái)實(shí)現(xiàn),而且C++的局部變量析構(gòu)規(guī)則也是按照先進(jìn)后出的方式執(zhí)行的。為此,我們需要定義一個(gè)Defer類(lèi):

#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++示例代碼可以寫(xiě)成:

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

	Defer d([&]()
	{
		fclose(fp);
	});
	if (...)
	{
		return;
	}
	if (...)
	{
		return;
	}
	if (...)
	{
		return;
	}
}

不用再在每一處返回前手動(dòng)寫(xiě)代碼關(guān)閉文件了。

但是這里還有一點(diǎn)不便之處就是需要手寫(xiě)一個(gè)lambda表達(dá)式和手動(dòng)定義一個(gè)變量,這個(gè)很好解決,使用宏來(lái)處理。

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

為了方便在同一函數(shù)多處使用,定義了defer宏來(lái)給變量命不同的名,前面的代碼可以改為:

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

	defer(fclose(fp));
	if (...)
	{
		return;
	}
	if (...)
	{
		return;
	}
	if (...)
	{
		return;
	}
}

這樣就實(shí)用且方便得多了。下面給出完整代碼以及測(cè)試用例:

#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;
}

結(jié)果如下:

C++中如何實(shí)現(xiàn)Go的defer功能

以上在VC 2015以及GCC、Clang下測(cè)試通過(guò)。

“C++中如何實(shí)現(xiàn)Go的defer功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站標(biāo)題:C++中如何實(shí)現(xiàn)Go的defer功能
鏈接URL:http://aaarwkj.com/article48/iijghp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、小程序開(kāi)發(fā)、App開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)公司搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
久久成人影院免费观看| 亚洲国产av福利久久| 青青草免费公开视频久久| 日本高清有码中文字幕| 亚洲av正片一区二区三区| 国产美女口爆吞精久久| 日韩精品视频在线不卡| av在线免费观看美日韩| 日本丰满熟女毛茸茸的黑逼| 欧美亚洲国产精品综合在线| 日本高清精品视频免费| 淫色网av人妻中文字幕| 欧美黄色一区二区三区视频| 免费午夜福利一区二区| 在线免费观看国产不卡| 一区不卡在线视频免费国产| 亚洲成人免费电影久久| 亚洲国产传媒在线观看| 国产成人精品久久性色av| 欧美日韩在线精品1区2区| 日本高清av一区二区| 丝袜亚洲激情欧美日韩偷拍| 中文字幕中文字幕久久不卡| 欧美日韩一级一区二区三区| 国产欧美一区二区三区高清| 人妻内射一区二区在线视| 一区二区三区精品人妻| 精品久久av一区二区三区| 人人妻人人澡人人爽老妇| 免费的黄色片带中文字幕| 欧美精品久久91九色| 视频一区二区三区不卡| 中文字幕中出亚洲精品| 国产亚洲无线码一区二区| 欧美精品高清在线视频| 亚洲黄色片大奶子水多| 91国产精品视频在线| 国产午夜福利一区在线| 国产综合一区二区三区视频| 爱高潮www亚洲精品| 日本黄色美女日本黄色|