成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

在 main 函數(shù)之前執(zhí)行代碼(C 語言)

王晗 / 2028人閱讀

摘要:函數(shù)又稱主函數(shù),是程序執(zhí)行的起點(diǎn)。類的構(gòu)造函數(shù)是類的一種特殊的成員函數(shù),它會(huì)在每次創(chuàng)建類的新對(duì)象時(shí)執(zhí)行。構(gòu)造函數(shù)可用于為某些成員變量設(shè)置初始值。析構(gòu)函數(shù)有助于在跳出程序比如關(guān)閉文件釋放內(nèi)存等前釋放資源。

main 函數(shù)

又稱主函數(shù),是程序執(zhí)行的起點(diǎn)。

在 main 函數(shù)之前

那么,我們有辦法在 main 函數(shù)之前執(zhí)行代碼嗎?

答案是肯定的。

先上代碼

before_main.c

#include __attribute((constructor)) void before_main(){	printf("%s/n", __FUNCTION__);}int main(int argc, char **argv){	printf("%s/n", __FUNCTION__);	return 0;}

編譯 && 執(zhí)行

$ gcc before_main.c -o before_main.out$ ./before_main.out before_mainmain

看到,先運(yùn)行 before_main(),再運(yùn)行 main()

原理

GNU C 的一大特色就是 attribute 機(jī)制。attribute 可以設(shè)置函數(shù)屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。
__attribute__書寫特征是:attribute 前后都有兩個(gè)下劃線,并且后面會(huì)緊跟一對(duì)括弧,括弧里面是相應(yīng)的 attribute 參數(shù)。

constructor 屬性可以使函數(shù)在 main 函數(shù)之前執(zhí)行

再往底層想,C 語言中,main 函數(shù)是程序的入口點(diǎn) 這件事情本來就是 gcc 編譯器 決定的。那么 gcc 當(dāng)然可以指定任何函數(shù)作為程序的入口,這點(diǎn)在我之前寫的一篇文章《沒有了 main 函數(shù),程序還能跑嗎?》中也有介紹。

這里又是通過另一種方式來影響程序入口點(diǎn)的,即 __attribute((constructor)) 方式。

在 main 函數(shù)之后

不光有 constructor 屬性能夠?qū)崿F(xiàn)在 main 函數(shù)之前執(zhí)行代碼;還有屬性 destructor,能夠?qū)崿F(xiàn)在 main 函數(shù)之后執(zhí)行代碼。如下:

#include __attribute((constructor)) void before_main(){	printf("%s/n", __FUNCTION__);}__attribute((destructor)) void after_main(){	printf("%s/n", __FUNCTION__);}int main(int argc, char **argv){	printf("%s/n", __FUNCTION__);	return 0;}

運(yùn)行

$ ./before_main.out before_mainmainafter_main

C++ 類的構(gòu)造函數(shù)、析構(gòu)函數(shù)

多像 C++ 中類的構(gòu)造函數(shù)和析構(gòu)函數(shù)啊。

類的 構(gòu)造函數(shù) 是類的一種特殊的成員函數(shù),它會(huì)在每次創(chuàng)建類的新對(duì)象時(shí)執(zhí)行。
構(gòu)造函數(shù)的名稱與類的名稱是完全相同的,并且不會(huì)返回任何類型,也不會(huì)返回 void。構(gòu)造函數(shù)可用于為某些成員變量設(shè)置初始值。

類的 析構(gòu)函數(shù) 是類的一種特殊的成員函數(shù),它會(huì)在每次刪除所創(chuàng)建的對(duì)象時(shí)執(zhí)行。
析構(gòu)函數(shù)的名稱與類的名稱是完全相同的,只是在前面加了個(gè)波浪號(hào)(~)作為前綴,它不會(huì)返回任何值,也不能帶有任何參數(shù)。析構(gòu)函數(shù)有助于在跳出程序(比如關(guān)閉文件、釋放內(nèi)存等)前釋放資源。

#include using namespace std;class Line {public:	void setLength(double len);	double getLength(void);	Line();	  // 這是構(gòu)造函數(shù)聲明	~Line();  // 這是析構(gòu)函數(shù)聲明private:	double length;};// 成員函數(shù)定義,構(gòu)造函數(shù)Line::Line(void){	cout << "Object is being created" << endl;}Line::~Line(void){	cout << "Object is being deleted" << endl;}void Line::setLength(double len){	length = len;}double Line::getLength(void){	return length;}int main(){	Line line;	// 設(shè)置長度	line.setLength(6.0);	cout << "Length of line : " << line.getLength() << endl;	return 0;}

運(yùn)行

Object is being createdLength of line : 6Object is being deleted

縱向思考 && 橫向聯(lián)想

學(xué)習(xí)的兩個(gè)好方法:縱向思考和橫向聯(lián)想。
縱向思考能夠讓你認(rèn)清事物本身,讓你對(duì)事物的理解更加深刻、正確。

就像我們對(duì) C 語言的程序入口的思考一樣,C 語言是被 gcc 編譯成可執(zhí)行文件的,從這個(gè)角度思考,gcc 的權(quán)利是大于 C 語言的,它讓你的哪個(gè)函數(shù)成為程序的入口點(diǎn),就讓哪個(gè)函數(shù)稱為入口點(diǎn)。main 函數(shù)作為程序的入口點(diǎn)只是大家共同的約定,gcc 可以無視。

橫向聯(lián)想能夠讓你發(fā)現(xiàn)多個(gè)事物之間的共同點(diǎn),能夠讓你舉一反三,達(dá)到觸類旁通的效果。

就像從 C 語言的 constructor 屬性和 destructor 屬性聯(lián)想到 C++ 的構(gòu)造函數(shù)和析構(gòu)函數(shù)

這兩個(gè)方法也是幫助我們成為 T 型人才的有力工具,我們要好好利用它。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121544.html

相關(guān)文章

  • 13 萬字 C 語言從入門到精通保姆級(jí)教程2021 年版 (建議收藏)

    摘要:友情提示先關(guān)注收藏,再查看,萬字保姆級(jí)語言從入門到精通教程。及大牛出天地開始有隨之乃有萬種語年英國劍橋大學(xué)推出了語言。 友情提示:先關(guān)注收藏,再查看,13 萬字保...

    zombieda 評(píng)論0 收藏0
  • 爆肝1萬字《c++入門綜合》

    摘要:大家好,今天屁孩君給大家?guī)砣腴T綜合。年,標(biāo)準(zhǔn)委員會(huì)發(fā)布了語言的第一個(gè)國際標(biāo)準(zhǔn),該標(biāo)準(zhǔn)即為大名鼎鼎的。年,標(biāo)準(zhǔn)委員會(huì)發(fā)布了一份技術(shù)報(bào)告,詳細(xì)說明了計(jì)劃引入的新特性。年月日,經(jīng)過標(biāo)準(zhǔn)委員投票,標(biāo)準(zhǔn)獲得一致通過。 ...

    _Dreams 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

王晗

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<