GNU的擴充套件屬性之 attribute

2021-09-24 14:29:31 字數 1170 閱讀 1897

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來進行配置,如下圖 ...