在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言強/弱符號和強/弱引用的作用

小麥大叔 ? 來源:小麥大叔 ? 作者:小麥大叔 ? 2022-07-12 11:55 ? 次閱讀

__attribute__ 是一個編譯器指令,其實是 GNU C 的一種機制,本質(zhì)是一個編譯器的指令,在聲明的時候可以提供一些屬性,在編譯階段起作用,來做多樣化的錯誤檢查和高級優(yōu)化。

用于在 C,C++,Objective-C 中修飾變量、函數(shù)、參數(shù)、方法、類等。

合理使用 __attribute__ 有什么好處?

  • 給編譯器提供上下文,幫助編譯器做優(yōu)化,合理使用可以收到顯著的優(yōu)化效果。
  • 編譯器會根據(jù) __attribute__ 產(chǎn)生一些編譯警告,使代碼更規(guī)范。
  • 給代碼閱讀者提供必要的注解,助其理解代碼意圖。

總之,__attribute__ 起到了給編譯器提供上下文的作用,如果錯誤的使用 __attribute__ 指令,因為給編譯器提供了錯誤的上下文,由此引起的錯誤通常很難被發(fā)現(xiàn)。

強符號和弱符號

在同一作用域下不能定義同一個變量或函數(shù),很多C語言學(xué)習(xí)者都理所當(dāng)然地這么認為。

這個其實是是有所偏頗的,GNU C對標(biāo)準(zhǔn)C語言進行了擴展,在GCC中,對于符號(在編譯時,變量和函數(shù)都被抽象成符號)而言,存在著強符號和弱符號之分

是的,是否支持這個特性是由不同的C語言標(biāo)準(zhǔn)決定的。

對于C/C++而言,編譯器默認函數(shù)和已初始化的全局變量為強符號,而未初始化的全局變量為弱符號。

編程者沒有顯示指定時,編譯器對強弱符號的定義會有一些默認行為,同時開發(fā)者也可以對符號進行指定,使用"attribute((weak))"來聲明一個符號為弱符號。

定義一個相同的變量,當(dāng)兩者不全是強符號時,gcc在編譯時并不會報錯,而是遵循一定的規(guī)則進行取舍:

  • 當(dāng)兩者都為強符號時,重復(fù)定義的報錯:redefinition of 'xxx'
  • 當(dāng)兩者為一強一弱時,選取強符號的值
  • 當(dāng)兩者同時為弱時,選擇其中占用空間較大的符號,這個其實很好理解,編譯器不知道編程者的用意,選擇占用空間大的符號至少不會造成諸如溢出、越界等嚴重后果。

在默認的符號類型情況下,強符號和弱符號是可以共存的,類似于這樣:

intx;
intx=1;

編譯不會報錯,在編譯時x的取值將會是1.

注意,這里可以使用__attribute__((weak))將強符號轉(zhuǎn)換為弱符號,卻不能與一個強符號共存,類似于這樣:

int__attribute__((weak))x=0;
intx=1;

編譯器將報重復(fù)定義錯誤。

強引用和弱引用

除了強符號和弱符號的區(qū)別之外,GNUC還有一個特性就是強引用和弱引用。

我們知道的是,編譯器在編譯階段只負責(zé)將源文件編譯成目標(biāo)文件(即二進制文件),然后由鏈接器對所有二進制文件進行鏈接操作。

編譯器默認所有的變量和函數(shù)為強引用,同時編程者可以使用__attribute__((weakref))來聲明一個函數(shù)。

注意這里是聲明而不是定義,既然是引用,那么就是使用其他模塊中定義的實體,對于函數(shù)而言,我們可以使用這樣的寫法:

__attribute__((weakref))voidfunc(void);

,然后在函數(shù)中調(diào)用func(),如果func()沒有被定義,則func的值為0,如果func被定義,則調(diào)用相應(yīng)func,在《程序員的自我修養(yǎng)》這本書中有介紹,它是這樣寫的:

__attribute__((weakref))voidfunc(void);
voidmain(void)
{
if(func){func();}
}

但是在現(xiàn)代的編譯系統(tǒng)中,這種寫法卻是錯誤的,編譯雖然通過(有警告信息),但是卻不正確:

warning:‘weakref’attributeshouldbeaccompaniedwithan‘alias’attribute[-Wattributes]

警告顯示:weakref需要伴隨著一個別名才能正常使用

強/弱符號和強/弱引用的作用

這種弱符號、弱引用的擴展機制在庫的實現(xiàn)中非常有用。

我們在庫中可以使用弱符號和弱引用機制,這樣對于一個弱符號函數(shù)而言,用戶可以自定義擴展功能的函數(shù)來覆蓋這個弱符號函數(shù)。

同時我們可以將某些擴展功能函數(shù)定義為弱引用,當(dāng)用戶需要使用擴展功能時,就對其進行定義,鏈接到程序當(dāng)中。

如果用戶不進行定義,則鏈接也不會報錯,這使得庫的功能可以很方便地進行裁剪和組合。

注意:C標(biāo)準(zhǔn)里根本沒有提到強、弱符號。這只是GCC這個實現(xiàn)定義的特性,在MS C編譯器里是不存在這個概念的。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7610

    瀏覽量

    137232
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4340

    瀏覽量

    62793
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1637

    瀏覽量

    49197

原文標(biāo)題:C語言進階小技巧,弱符號和弱引用

文章出處:【微信號:knifewheat,微信公眾號:小麥大叔】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    snmp口令及安全加固

    snmp口令及安全加固 口令檢測 ? nmap –sU –p161 –script=snmp-brute ip //查找snmp口令 ? 口令利用 ? nmap -sU -p1
    的頭像 發(fā)表于 12-17 14:47 ?164次閱讀

    4G5G手機信號放大器:從,為數(shù)字生活加速

    深圳特信屏蔽器|4G5G手機信號放大器:從,為數(shù)字生活加速
    的頭像 發(fā)表于 09-11 16:18 ?620次閱讀

    電機磁時的電流大小關(guān)系?

    電機的相電流按矢量選擇分為勵磁電流和轉(zhuǎn)矩電流,勵磁電流用于產(chǎn)生磁場,轉(zhuǎn)矩電流用于提供扭矩。 在電機磁時,即到達恒功率區(qū)時刻,電機的勵磁電流開始減小,這是因為要磁,但是轉(zhuǎn)矩電流會增大,這是因為要
    發(fā)表于 07-13 13:09

    其利天下技術(shù)·無刷電機磁控制是什么?有什么好處·BLDC驅(qū)動方案

    作為一個無刷電機驅(qū)動方案開發(fā)商,我們在開發(fā)產(chǎn)品的時候就會用到“磁控制技術(shù)”。比如,我們開發(fā)的吸塵器方案時就會用到。什么是磁控制技術(shù),它又有什么優(yōu)勢呢?其利天下技術(shù)無刷電機驅(qū)動方案開發(fā)
    的頭像 發(fā)表于 06-07 18:42 ?1187次閱讀
    其利天下技術(shù)·無刷電機<b class='flag-5'>弱</b>磁控制是什么?有什么好處·BLDC驅(qū)動方案

    什么是電機的磁?電機磁的可能原因有哪些?

    在電機運行的過程中,我們有時會遇到電機磁的情況。電機磁,簡而言之,即電機在運行時輸出功率下降,不足以滿足正常使用需求的現(xiàn)象。這一現(xiàn)象可能由多種原因引起,對電機的性能和運行穩(wěn)定性產(chǎn)生不良影響。本文將詳細探討電機的磁現(xiàn)象及其可
    的頭像 發(fā)表于 06-04 16:15 ?4571次閱讀

    4G手機信號放大器:解決信號區(qū),提升移動網(wǎng)絡(luò)

    深圳特信電子|4G手機信號放大器:解決信號區(qū),提升移動網(wǎng)絡(luò)
    的頭像 發(fā)表于 05-06 08:58 ?1749次閱讀

    關(guān)于嵌入式C語言符號引用解析

     總之,__attribute__ 起到了給編譯器提供上下文的作用,如果錯誤的使用 __attribute__ 指令,因為給編譯器提供了錯誤的上下文,由此引起的錯誤通常很難被發(fā)現(xiàn)。
    發(fā)表于 05-03 10:48 ?243次閱讀

    STM32 GPIO上拉能做輸入輸出嗎?

    STM32 GPIO 上拉能做輸入輸出嗎
    發(fā)表于 04-07 07:07

    使用WorkBench做BLDC的磁控制,但是電機轉(zhuǎn)速沒看到提升的跡象,為什么?

    目前使用WorkBench做BLDC的磁控制,已經(jīng)使能了MTPA和Flux weakening選項,查看單片機運行的反饋也有勾選“Flux weakening”,但是電機轉(zhuǎn)速沒看到提升的跡象。空轉(zhuǎn)額定是5500rpm左右,開磁還是這么多。
    發(fā)表于 04-03 08:10

    FOC電機控制HALL+磁,開啟磁之后為什么轉(zhuǎn)速會一直增加,不受PI控制?

    FOC電機控制代碼使用HALL沒開啟磁之前可以通過PI調(diào)節(jié)轉(zhuǎn)速,但是開啟磁之后為什么轉(zhuǎn)速會一直增加,不受PI控制?
    發(fā)表于 03-27 07:55

    電機控制磁開啟之后,為什么轉(zhuǎn)速提高電流也提升了?

    根據(jù)磁控制原理,不應(yīng)該是達到當(dāng)前電壓轉(zhuǎn)速極限之后開啟磁電流降低,轉(zhuǎn)速增加嗎?
    發(fā)表于 03-27 06:50

    宋仕論道”系列講座的文章暨宋仕先生研究華強北模式和華強北文化的系列文章,再次迎來更新!

    :科技創(chuàng)新驅(qū)動電子信息生態(tài)重構(gòu)》的評論類文章,明確指出“近日,中國電子元器件產(chǎn)業(yè)權(quán)威人士宋仕對深圳華強北的轉(zhuǎn)型之路進行了深入剖析”,并在文章中多處引用了宋仕先生關(guān)于深圳華強北的研究觀點。不到一天
    發(fā)表于 03-26 10:36

    AI時代,存

    以存算,以存訓(xùn),以存
    的頭像 發(fā)表于 03-22 09:17 ?2200次閱讀
    AI時代,存<b class='flag-5'>強</b>則<b class='flag-5'>強</b>

    雙面布局貼補,F(xiàn)PC焊接很受傷

    顆是什么味道。 一大早,林如煙和趙理工剛來到辦公室、大師兄讓他們稍微整理下,就開始講FPC補的介紹、分類、作用,特別是關(guān)于補的案例,真的讓他們感慨事后諸葛亮,事前很迷茫。 什么是補
    發(fā)表于 03-11 17:57

    枚舉有多大?c語言枚舉end的作用是什么?

    枚舉有多大?c語言枚舉end的作用是什么? 枚舉在C語言中是一種常見的數(shù)據(jù)類型,用于定義一組相互關(guān)聯(lián)的常量或者變量。它通常用于表示一系列可能
    的頭像 發(fā)表于 01-19 14:19 ?637次閱讀
    主站蜘蛛池模板: 又黑又长黑人欧美三级| 午夜剧场黄色| 曰本裸色私人影院噜噜噜影院| 激情97| 日韩特级毛片免费观看视频| 欧美aaa| 狠狠色噜噜狠狠狠狠97影音先锋| 高h乱肉辣文辣书阁| 一区二区不卡视频| 天天视频一区二区三区| 九九re热| 亚洲 欧美 成人| 久热99| 亚洲香蕉视频| 在线色站| 99热精品一区| 激情五月社区| 亚洲毛片大全| 一级毛片看真人在线视频| 亚洲色图第一页| 日本黄色的视频| 黄色片香蕉视频| 在线观看一级片| 极品丰满翘臀后进啪啪| 免费一级特黄特色大片| 天天干天天色天天干| 午夜国产精品久久影院| 午夜窝窝| 天天爱夜夜| 日日夜夜爽| 男人免费看片| 日本69xxxxx| 中文一区在线观看| 正在播放亚洲一区| 中文字幕三级| 欧洲成品大片在线播放| 成人伊人亚洲人综合网站222| 四虎1515hh永久久免费| 狼人射综合| 国产精品久久久久久福利 | 特级中国aaa毛片|