main 函式
又稱主函式,是程式執行的起點,
在 main 函式之前
那么,我們有辦法在 main 函式之前執行代碼嗎?
答案是肯定的,
先上代碼
before_main.c
#include <stdio.h>
__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_main
main
看到,先運行 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 <stdio.h>
__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_main
main
after_main
C++ 類的建構式、解構式
多像 C++ 中類的建構式和解構式啊,
類的
建構式是類的一種特殊的成員函式,它會在每次創建類的新物件時執行,
建構式的名稱與類的名稱是完全相同的,并且不會回傳任何型別,也不會回傳 void,建構式可用于為某些成員變數設定初始值,
類的
解構式是類的一種特殊的成員函式,它會在每次洗掉所創建的物件時執行,
解構式的名稱與類的名稱是完全相同的,只是在前面加了個波浪號(~)作為前綴,它不會回傳任何值,也不能帶有任何引數,解構式有助于在跳出程式(比如關閉檔案、釋放記憶體等)前釋放資源,
#include <iostream>
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 created
Length of line : 6
Object is being deleted
縱向思考 && 橫向聯想
學習的兩個好方法:縱向思考和橫向聯想,
縱向思考能夠讓你認清事物本身,讓你對事物的理解更加深刻、正確,
就像我們對 C 語言的程式入口的思考一樣,C 語言是被 gcc 編譯成可執行檔案的,從這個角度思考,gcc 的權利是大于 C 語言的,它讓你的哪個函式成為程式的入口點,就讓哪個函式稱為入口點,main 函式作為程式的入口點只是大家共同的約定,gcc 可以無視,
橫向聯想能夠讓你發現多個事物之間的共同點,能夠讓你舉一反三,達到觸類旁通的效果,
就像從 C 語言的 constructor 屬性和 destructor 屬性聯想到 C++ 的建構式和解構式
這兩個方法也是幫助我們成為 T 型人才的有力工具,我們要好好利用它,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303983.html
標籤:其他
