語法
__attribute__((attribute_list))
// 可用於函數、變數、型別
1. constructor:main 前自動執行
void init_lib() __attribute__((constructor));
void init_lib() {
printf("Library initialized\n");
}
int main() {
printf("main start\n");
return 0;
}
// 輸出:
// Library initialized
// main start
- 優先級可指定:
__attribute__((constructor(101))),數字越小越早執行。
- 對應
destructor 在 main 返回或 exit 時執行。
- 常用於:庫自動註冊、資源初始化、測試框架自動收集測試案例。
2. weak + alias:符號弱化與別名
// strong.c
void StrongFunc() { printf("strong.c: StrongFunc\n";) }
// weak.c
void WeakFunc() __attribute__((weak, alias("StrongFunc")));
void WeakFunc() { printf("weak.c: WeakFunc\n";) } // 弱定義
int main() {
WeakFunc(); // 呼叫
return 0;
}
連結行為
| 連結方式 | 結果 |
gcc weak.c -o weak | 使用弱定義 → 輸出 weak.c: WeakFunc |
gcc strong.c weak.c -o strong | 強定義覆蓋弱定義 → 輸出 strong.c: StrongFunc |
應用場景
- 庫提供預設實現:標記為
weak,使用者可自行定義同名函數覆蓋(如 malloc 鉤子、assert 處理器)。
- 別名重定向:
alias 讓舊函數名指向新實現,保持二進位相容。
- 選擇性編譯:功能模組若未連結,弱符號提供存根避免連結錯誤。
其他常用屬性
| 屬性 | 用途 |
noreturn | 函數不返回 (如 exit, abort),優化調用點 |
format(printf, m, n) | 檢查格式字串與參數匹配 (m=格式字串參數位置, n=首變參位置) |
unused | 抑制「未使用」警告 |
packed | 結構體取消對齊,緊湊排列 |
aligned(n) | 指定變數/結構體對齊邊界 |
cleanup(func) | 變數離開作用域自動呼叫 func (GNU C 擴展) |
可移植性建議
#ifdef __GNUC__
#define ATTR(x) __attribute__(x)
#else
#define ATTR(x)
#endif
void my_init() ATTR((constructor));
void my_func() ATTR((noreturn));
__attribute__ 是 GCC/Clang 擴展的強大元編程工具,善用 constructor/weak/alias/format 可大幅提升庫的易用性、安全性與二進位相容性,但需注意非標準屬性在 MSVC 上不可用,需用宏隔離。
- 上一篇文章: C語言 Boyer-Moore 字串匹配算法完整實現
- 下一篇文章: lw_oopc:C語言輕量級面向物件框架原理與使用指南
Copyright ©
程式碼之家 All Rights Reserved