如果經(jīng)常看Linux源碼,一定會(huì)見(jiàn)過(guò) attribute 屬性,他在 Linux 里面出現(xiàn)的很多。
attribute 是 gcc 的擴(kuò)展功能,它不屬于標(biāo)準(zhǔn)C語(yǔ)言。
使用 attribute 可以修飾變量、函數(shù)或者數(shù)據(jù)類(lèi)型的屬性,屬性有很多,有些確實(shí)很有用。
找了幾個(gè)可以修飾函數(shù)的屬性,供大家參考下。
如果希望函數(shù)可以在 main 函數(shù)前面執(zhí)行,可以用 constructor 屬性,就是構(gòu)造的意思。
如果希望函數(shù)可以在 main 函數(shù)之后執(zhí)行,可以用 destrucotr 屬性,有點(diǎn)析構(gòu)的意思。
網(wǎng)上有些介紹使用這兩個(gè)屬性來(lái)模擬 C++ 的構(gòu)造函數(shù)和析構(gòu)函數(shù),說(shuō)實(shí)話,這比 C++ 里面的構(gòu)造和析構(gòu)差遠(yuǎn)了,用它來(lái)給程序做些初始化、回收的操作,還是可以的。
第二個(gè),nonnull。
寫(xiě)函數(shù)的時(shí)候,我們經(jīng)常對(duì)函數(shù)做入?yún)⑴袛?,比如防止傳進(jìn)來(lái)的參數(shù)是空指針,導(dǎo)致程序下面出現(xiàn)異常。
使用 nonnull 屬性,可以讓編譯器來(lái)判斷。如果傳進(jìn)來(lái)的參數(shù)是 NULL,編譯的時(shí)候會(huì)提示警告,非常的人性化。
第三個(gè),deprecated。
如果想把某個(gè)函數(shù)廢棄掉,比如在項(xiàng)目的后續(xù)版本中不再使用,可以使用 deprecated 屬性,加上這個(gè)屬性,如果你還是使用這個(gè)函數(shù),編譯就會(huì)提示警告。
比如常見(jiàn)的 gets 函數(shù),如果一下子把它從標(biāo)準(zhǔn)庫(kù)中刪掉,對(duì)以前的程序不夠友好,所以只能提醒。
第四個(gè),noreturn。
對(duì)于不會(huì)返回的函數(shù),可以使用 noreturn 屬性。注意,返回值是 void 類(lèi)型和函數(shù)不返回是兩碼事,這樣的代碼編譯會(huì)提示警告。
如果在函數(shù)內(nèi)部加上死循環(huán)或者退出,這樣的函數(shù)才屬于不返回。
第五個(gè),weak,用于定義弱函數(shù)。
比如在一個(gè)文件中定義了弱函數(shù),另一個(gè)文件完全可以重新再定義一遍,并且編譯器會(huì)自動(dòng)鏈接到用戶定義的新函數(shù)上。
weak 屬性在 STM32 上面出現(xiàn)的很多,比如中斷函數(shù)等等。
gcc 擴(kuò)展的屬性很多,打開(kāi) gcc 文檔,粗略的估算了一下,可能有百來(lái)個(gè)。
可能是C語(yǔ)言也發(fā)現(xiàn)了這些屬性好用,在最新的C23標(biāo)準(zhǔn)里面,也加入了屬性這個(gè)概念,不過(guò)用法很奇葩,使用兩個(gè)嵌套的中括號(hào),而且目前支持的屬性也比較少。
編譯器一直都是走在標(biāo)準(zhǔn)的前面,也許在接下來(lái)的某個(gè)C語(yǔ)言標(biāo)準(zhǔn)中,會(huì)有更多的 gcc 屬性加入到C語(yǔ)言中。
-
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219009 -
GCC
+關(guān)注
關(guān)注
0文章
112瀏覽量
26249
原文標(biāo)題:gcc的attribute屬性,確實(shí)值得學(xué)習(xí)
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
深入解析RC38312A評(píng)估板:高性能時(shí)鐘解決方案的探索
GCC開(kāi)發(fā)工程的模版
芯來(lái)IDE是否支持__attribute__( (packed) )?需要設(shè)置什么嗎?
如何將某個(gè)函數(shù)或變量放在固定的地址 ?
如何利用 gcc 編譯Ccode?
GD32F470使用__attribute__語(yǔ)句,keil編譯通過(guò)但是scons編譯不通過(guò),為什么?
商品類(lèi)目屬性查詢(xún)接口技術(shù)實(shí)現(xiàn)詳解
cubemx+clion+gcc無(wú)法使用msh怎么解決?
《AI芯片:科技探索與AGI愿景》—— 深入硬件核心的AGI指南
CW32L010 MCU在VSCode+GCC+EIDE+JLink下的使用示例
深入探索GCC的attribute屬性
評(píng)論