__attribute__中constructor和destructor
1、前言
最近看到一份代碼,看到一個(gè)函數(shù)前面用__attribute__((destructor))修飾,當(dāng)時(shí)感覺有點(diǎn)怪怪的,搜了整個(gè)程序,也沒發(fā)現(xiàn)哪個(gè)地方調(diào)用這個(gè)函數(shù)。于是從字面意思猜想,該函數(shù)會(huì)在程序結(jié)束后自動(dòng)調(diào)用,與C++中的析構(gòu)函數(shù)類似。第一次接觸GNU下的attribute,總結(jié)一下。
2、__attribute__介紹
__attribute__可以設(shè)置函數(shù)屬性(Function Attribute)、變量屬性(Variable Attribute)和類型屬性(Type Attribute)。__attribute__前后都有兩個(gè)下劃線,并且后面會(huì)緊跟一對(duì)原括弧,括弧里面是相應(yīng)的__attribute__參數(shù)
__attribute__語(yǔ)法格式為:__attribute__ ( ( attribute-list ) )
若函數(shù)被設(shè)定為constructor屬性,則該函數(shù)會(huì)在main()函數(shù)執(zhí)行之前被自動(dòng)的執(zhí)行。類似的,若函數(shù)被設(shè)定為destructor屬性,則該函數(shù)會(huì)在main()函數(shù)執(zhí)行之后或者exit()被調(diào)用后被自動(dòng)的執(zhí)行。例如下面的程序:
#include <stdio.h> #include <stdlib.h> static int * g_count = NULL; __attribute__((constructor)) void load_file() { printf("Constructor is called.\n"); g_count = (int *)malloc(sizeof(int)); if (g_count == NULL) { fprintf(stderr, "Failed to malloc memory.\n"); } } __attribute__((destructor)) void unload_file() { printf("destructor is called.\n"); if (g_count) free(g_count); } int main() { return 0; }
程序執(zhí)行結(jié)果如下:
3、參考****
關(guān)于__attribute__的更多更加詳細(xì)的介紹可以參考:
http://blog.csdn.net/polisan/article/details/5031142
http://blog.csdn.net/ithomer/article/details/6566739
GCC __attribute__((constructor)|(destructor))
在閱讀TGTD的代碼時(shí)發(fā)現(xiàn)了一個(gè)非常詭異的問題,聲明了一個(gè)空的全局?jǐn)?shù)組,在使用的時(shí)候卻發(fā)現(xiàn)數(shù)組非空,在main()入口時(shí)數(shù)組已經(jīng)非空.數(shù)組時(shí)在什么地方被賦值了呢?最后發(fā)現(xiàn)__attribute__這個(gè)東東在起作用,類似于全局變量類的構(gòu)造函數(shù)在main()前被調(diào)用.
__attribute__((constructor))
__attribute__((destructor))
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。