虛函數

虛函數

一、使用場景
  當在項目中我們不確定外部模塊是否提供一個函數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)中不會生效,動態庫執行哪一個取決於鏈接的順序。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章