__attribute__機制是GNU C的一大特色,可以用來設置函數,變量和數據類型的屬性,下面對工作中正好用到的兩個屬性做下簡單介紹。
這個屬性指定函數在main函數執行之前執行
RunBeforeMain( RunBeforeMain(% main(%
輸出順序如下:
RunbeforeMain
main
2. weak, alias
weak: weak symbol. 若存在兩個相同的全局符號時,會引發重定義錯誤. 如果使用weak attribute,則當weak symbol和non-weak symbol同時存在的時候,linker會使用non-weak symbol.若只有weak symbol存在的時候則只使用weak symbol.
alias: 設置函數的別名,如
example() __attribute__((alias()));
將example函數設為__example的別名
這兩個屬性結合起來使用可以在non-weak symbol沒有聲明的情況下仍然編譯執行成功。
//strong.c
#include <stdio.h>
//weak.c
#include <stdio.h> StrongFun()__attribute__((weak, alias( main( argc, **
單獨鏈接時,
gcc -o weak weak.o
./weak
輸出結果:
weak.c:WeakFun
同時鏈接時,
gcc -o strong weak.o strong.o
./strong
輸出結果
strong.c:StrongFun