采用 #pragma weak name 形式時,指令使 name 成為弱符號。鏈接程序沒有找到 name 的符號定義時,不會顯示錯誤消息,也不會出現符號的多個弱定義的錯誤消息。鏈接程序僅執行第一個遇到的定義。
如果另一個編譯單元有函數或變量的強定義,那麼 name 將鏈接到它。如果沒有 name 的強定義,那麼鏈接程序符號的值為 0。
編譯單元A cu1.c
<stdio.h> weak foo *= & (ptr ==
編譯單元B cu2.c
foo = ;
只編譯單元A:gcc cu1.c && ./a.out ,執行if語句。
編譯兩個單元:gcc cu1.c cu2.c && ./a.out ,執行else語句。
cu3.c
<stdio.h> foo( weak foo (foo !=
編譯 gcc cu3.c && ./a.out ,提示foo未被定義。
編譯單元A cu4.c
<stdio.h> foo( foo1( weak foo = foo1
編譯單元B cu5.c
<stdio.h> foo(
只編譯單元A:gcc cu4.c && ./a.out ,執行foo1。
編譯兩個單元:gcc cu4.c cu5.c && ./a.out ,執行foo。