一、使用場景
當在項目中我們不確定外部模塊是否提供一個函數func,但是我們不得不用這個函數,爲了代碼能夠正常編譯、運行則自己模塊代碼中定義一個弱函數即可。
二、weak關鍵字介紹
week關鍵字就是將一個函數定義爲弱符號類型。假如將本模塊中的函數func爲弱符號類型,如果遇到強符號類型,那麼我們在本模塊執行的func將會是外部模塊定義的func。如果外部模塊沒有定義func,那麼將會調用這個弱符號。相當於增加了一個默認函數。
原理:連接器發現同時存在弱符號和強符號,優先選擇強符號,如果發現不存在強符號,只存在弱符號,則選擇弱符號。如果都不存在:靜態鏈接時編譯時報錯,動態鏈接則系統無法啓動。
三、用法舉例
例1:有強符號類型
/*
函數介紹:主函數
*/
#include <stdio.h>
#include "sum.h"
void __attribute__((weak))sum(void)//弱符號類型
{
int a=1,b=2;
printf("weak attributes sum() functiom a+b=%d\n",a+b);
}
int main()
{
sum();
return 0;
}
/*
函數介紹:計算a+b的和
*/
#include "sum.h"
#include <stdio.h>
void sum(void)//強符號類型
{
int a=2,b=3;
printf("Strong attributes sum() functiom a+b=%d\n",a+b);
}
運行結果:Strong attributes sum() functiom a+b=5
例2:無強符號類型
/*
函數介紹:主函數
*/
#include <stdio.h>
#include "sum.h"
void __attribute__((weak))sum(void)
{
int a=1,b=2;
printf("weak attributes sum() functiom a+b=%d\n",a+b);
}
int main()
{
sum();
return 0;
}
/*
函數介紹:計算a+b的和
*/
#include "sum.h"
#include <stdio.h>
/*
void sum(void)
{
int a=2,b=3;
printf("Strong attributes sum() functiom a+b=%d\n",a+b);
}
*/
運行結果:weak attributes sum() functiom a+b=3
四、注意事項
weak屬性只會在靜態庫(.o .a)中生效,動態庫(.so .ko)中不會生效,動態庫執行哪一個取決於鏈接的順序。