#pragma weak name 將符號 name 標記為弱符號。鏈接器處理規則如下:
此機制常用於:提供預設實現、實現可選功能模組、庫的版本兼容等場景。
編譯單元 A (cu1.c)
#include <stdio.h>
#pragma weak foo
void foo(void) { printf("weak foo\n"); }
int main() {
if (foo) foo(); else printf("foo not defined\n");
return 0;
}
編譯單元 B (cu2.c)
void foo(void) { printf("strong foo\n"); }
gcc cu1.c && ./a.out → 輸出 weak foo(弱定義生效)。gcc cu1.c cu2.c && ./a.out → 輸出 strong foo(強定義覆蓋弱定義)。cu3.c
#include <stdio.h>
#pragma weak foo
int main() {
if (foo) foo(); else printf("foo not defined\n");
return 0;
}
編譯運行:gcc cu3.c && ./a.out → 輸出 foo not defined。鏈接器未報錯,弱符號值為 0,條件判斷為假。
編譯單元 A (cu4.c)
#include <stdio.h>
void foo(void) { printf("foo\n"); }
void foo1(void) { printf("foo1\n"); }
#pragma weak foo = foo1 // foo 為 foo1 的弱別名
編譯單元 B (cu5.c)
#include <stdio.h>
void foo(void) { printf("strong foo in cu5\n"); }
gcc cu4.c && ./a.out → 呼叫 foo() 實際執行 foo1(),輸出 foo1。gcc cu4.c cu5.c && ./a.out → 外部強定義 foo 覆蓋弱別名,輸出 strong foo in cu5。#pragma comment(linker, "/alternatename:...") 或 __declspec(selectany) 實現類似功能,語法不同。extern 或標頭檔),否則會有「隱式聲明」警告。