国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

在 main 函數之前執行代碼(C 語言)

王晗 / 2012人閱讀

摘要:函數又稱主函數,是程序執行的起點。類的構造函數是類的一種特殊的成員函數,它會在每次創建類的新對象時執行。構造函數可用于為某些成員變量設置初始值。析構函數有助于在跳出程序比如關閉文件釋放內存等前釋放資源。

main 函數

又稱主函數,是程序執行的起點。

在 main 函數之前

那么,我們有辦法在 main 函數之前執行代碼嗎?

答案是肯定的。

先上代碼

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

編譯 && 執行

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

看到,先運行 before_main(),再運行 main()

原理

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

constructor 屬性可以使函數在 main 函數之前執行

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

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

在 main 函數之后

不光有 constructor 屬性能夠實現在 main 函數之前執行代碼;還有屬性 destructor,能夠實現在 main 函數之后執行代碼。如下:

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

運行

$ ./before_main.out before_mainmainafter_main

C++ 類的構造函數、析構函數

多像 C++ 中類的構造函數和析構函數啊。

類的 構造函數 是類的一種特殊的成員函數,它會在每次創建類的新對象時執行。
構造函數的名稱與類的名稱是完全相同的,并且不會返回任何類型,也不會返回 void。構造函數可用于為某些成員變量設置初始值。

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

#include using namespace std;class Line {public:	void setLength(double len);	double getLength(void);	Line();	  // 這是構造函數聲明	~Line();  // 這是析構函數聲明private:	double length;};// 成員函數定義,構造函數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;	// 設置長度	line.setLength(6.0);	cout << "Length of line : " << line.getLength() << endl;	return 0;}

運行

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

縱向思考 && 橫向聯想

學習的兩個好方法:縱向思考和橫向聯想。
縱向思考能夠讓你認清事物本身,讓你對事物的理解更加深刻、正確。

就像我們對 C 語言的程序入口的思考一樣,C 語言是被 gcc 編譯成可執行文件的,從這個角度思考,gcc 的權利是大于 C 語言的,它讓你的哪個函數成為程序的入口點,就讓哪個函數稱為入口點。main 函數作為程序的入口點只是大家共同的約定,gcc 可以無視。

橫向聯想能夠讓你發現多個事物之間的共同點,能夠讓你舉一反三,達到觸類旁通的效果。

就像從 C 語言的 constructor 屬性和 destructor 屬性聯想到 C++ 的構造函數和析構函數

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121544.html

相關文章

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

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

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

    摘要:大家好,今天屁孩君給大家帶來入門綜合。年,標準委員會發布了語言的第一個國際標準,該標準即為大名鼎鼎的。年,標準委員會發布了一份技術報告,詳細說明了計劃引入的新特性。年月日,經過標準委員投票,標準獲得一致通過。 ...

    _Dreams 評論0 收藏0

發表評論

0條評論

王晗

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<