首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

GCC __attribute__ 機制詳解:constructor、weak、alias 實戰應用

     編輯:關於C語言

語法

__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;
}

連結行為

應用場景

  • 庫提供預設實現:標記為 weak,使用者可自行定義同名函數覆蓋(如 malloc 鉤子、assert 處理器)。
  • 別名重定向:alias 讓舊函數名指向新實現,保持二進位相容。
  • 選擇性編譯:功能模組若未連結,弱符號提供存根避免連結錯誤。

其他常用屬性

連結方式結果
gcc weak.c -o weak使用弱定義 → 輸出 weak.c: WeakFunc
gcc strong.c weak.c -o strong強定義覆蓋弱定義 → 輸出 strong.c: StrongFunc
屬性用途
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 上不可用,需用宏隔離。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved