C語(yǔ)言中,同一個(gè)函數(shù)能不能被定義兩次?
稍微有點(diǎn)C語(yǔ)言基礎(chǔ)的同學(xué),一定知道不能這樣做。
最近有同學(xué)在學(xué)習(xí)STM32,他就發(fā)現(xiàn)了這么一個(gè)問(wèn)題,有些函數(shù)前面加了 __weak,然后這個(gè)函數(shù)就可以被重新定義。
這種情況常見(jiàn)于中斷函數(shù)里面,意思就是用戶可以自己定義,也可以用系統(tǒng)提供的。
__weak并不是C語(yǔ)言里面的關(guān)鍵字,具體的實(shí)現(xiàn)還是得看編譯器。
比如在keil里面,__weak就是一個(gè)宏定義,使用了C語(yǔ)言里面的 attribute 機(jī)制,這個(gè)機(jī)制我們?cè)谇懊嬉仓v過(guò),里面可以用 packed aligned unused 等等。
今天我們?cè)賮?lái)補(bǔ)充一個(gè),weak。
比如在 test.c 文件中定義了函數(shù) test,如果在 main.c 里面又定義了一次,那編譯的時(shí)候,肯定會(huì)提示函數(shù)重復(fù)定義,一個(gè)函數(shù)不能被定義兩次。
但是如果在某個(gè) test 函數(shù)前面加上 __attribute__((weak)),編譯就能順利通過(guò)。
并且運(yùn)行的時(shí)候,默認(rèn)調(diào)用的也是前面沒(méi)有 weak 修飾的函數(shù)。
weak 就是告訴編譯器,該函數(shù)為弱定義,作為備選,如果用戶自己定義了,還是優(yōu)先調(diào)用用戶定義的函數(shù)。
審核編輯:劉清
-
STM32
+關(guān)注
關(guān)注
2293文章
11031瀏覽量
364616 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141587
原文標(biāo)題:函數(shù)也能重復(fù)定義
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論