1、 在碰到這個問題以前,在學習linux的啟動時也知道main函式之前也會執行很多的初始化相關的程式,但是今天在乙個應用程式中碰到了乙個現象,就是函式的執行在main之前,廢話不多說先寫乙個demo程式:
#include __attribute__((constructor)) void before(void)
__attribute__((destructor)) void after(void)
int main(void)
編譯執行之後:列印的結果顯示:
run first
i am main function
run after
根據列印的結果我們可以看出來before函式在main函式之前先執行了,after函式在main函式之後執行。
之所以會有這個現象就是因為before前面有個__attribute((constructor))__在修飾。__attribute((destructor))__在main函式之後執行。
2、如果在main之前還要執行很多的前置動作或者後續的處理動作,我們可以使用__attribute__((constructor(priority)))和__attribute__((destructor(priority))),priority的值是大於100的整數,可以從101開始,0-100之間的數值是系統使用的。
__attribute__((constructor(101))) void prec_proc1(void)
__attribute__((destructor(101))) void end_proc1(void)
__attribute__((constructor(102))) void prec_proc2(void)
__attribute__((destructor(102))) void end_proc2(void)
int main(void)
編譯之後執行結果如下:
[start_proc1 17]
[start_proc2 25]
i am main function
[end_proc2 29]
[end_proc1 21]
所以:前處理是按照優先順序處理,後處理則是相反的。
GNU對C語言的擴充套件 結構體
在閱讀gnu linux核心 時,我 們會遇到一種特殊的結構初始化方式。該方式是某些c教材 如譚二版 k r二版 中沒有介紹過的。這種方式稱為指定初始化 designated initializer 下面我們看乙個例子,linux 2.6.x drivers usb storage usb.c中有這...
函式的擴充套件 name屬性
函式的name屬性返回該函式的函式名 function foo foo.name foo 這個屬性早就被瀏覽器廣泛支援,但是直到 es6,才將其寫入了標準。需要注意的是,es6 對這個屬性的行為做出了一些修改。如果將乙個匿名函式賦值給乙個變數,es5 的name屬性,會返回空字串,而 es6 的na...
如何應用Sql Server的擴充套件屬性
sql server支援表的擴充套件屬性和列的擴充套件屬性。我們在設計表或列的時候,一般情況下,都是通過表或列的名字來表達其涵義,但有時候表名或列名無法具體描述時,就需要使用它們的擴充套件屬性了。表及列的擴充套件屬性可以通過sql server management studio來進行配置,如下圖 ...