女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

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

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

合理使用 __attribute__ 有什么好處?

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

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

強符號和弱符號

在同一作用域下不能定義同一個變量或函數,很多C語言學習者都理所當然地這么認為。

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

是的,是否支持這個特性是由不同的C語言標準決定的。

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

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

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

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

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

intx;
intx=1;

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

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

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

編譯器將報重復定義錯誤。

強引用和弱引用

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

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

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

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

__attribute__((weakref))voidfunc(void);

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

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

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

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

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

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

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

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

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

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

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

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7630

    瀏覽量

    140207
  • 函數
    +關注

    關注

    3

    文章

    4367

    瀏覽量

    64159
  • 編譯器
    +關注

    關注

    1

    文章

    1654

    瀏覽量

    49880

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    芯盾時代用戶身份和訪問管理平臺助力企業消滅口令

    口令,是網絡安全中的老大難問題,因為口令導致的重大網絡安全事件屢見不鮮。在攻防演練中,利用口令進行攻擊是紅隊最常用的攻擊手段之一,在所有攻擊中占比近30%,僅次于0day漏洞。
    的頭像 發表于 04-27 09:16 ?290次閱讀

    景嘉微榮獲2024湖南湘江新區民營企業“稅收貢獻百”“研發投入百”“社會責任百”稱號

    近日,在湖南湘江新區民營企業家座談會上,2024 湖南湘江新區民營企業百榜單正式揭曉。長沙景嘉微電子股份有限公司憑借卓越的表現,成功斬獲 “稅收貢獻百”“研發投入百”“社會責任百
    的頭像 發表于 02-23 17:50 ?807次閱讀

    繼電器的作用及常用類型介紹

    控制。 隔離 :繼電器可以在不同電壓或電流等級的電路之間提供電氣隔離,保護控制電路不受高電壓或大電流的影響。 放大 :在信號控制負載的情況下,繼電器可以將小信號放大,驅動較大的負載。 轉換 :繼電器可以實現電路狀態的轉換
    的頭像 發表于 12-28 11:09 ?2372次閱讀

    snmp口令及安全加固

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

    榮獲2024智能客服企業TOP20

    憑借其深厚的技術積累和創新能力,不斷推出高性能、高質量的產品和解決方案,榮登2024智能客服企業榜單TOP20,這是對普卓越的技術實力和應用層面的肯定。
    的頭像 發表于 11-21 15:57 ?498次閱讀

    中科創達榮登北京民營企業百和科技創新百榜單

    日前,北京市工商聯與通州區委、區政府共同舉辦“2024北京民營企業百”發布會,正式揭曉了北京民營企業百“1+4”榜單。作為全球領先的智能操作系統及端側智能產品和技術提供商,中科創達榮耀入選“北京
    的頭像 發表于 11-14 11:44 ?739次閱讀

    適合可燃(A2L)制冷劑檢測的氣體傳感器模塊FCM2630

    隨著全球對環境保護意識的增強,傳統的不可燃(A1)氟利昂制冷劑因其對氣候變暖的顯著影響而逐漸被淘汰。為了應對這一挑戰,可燃(A2L)制冷劑應運而生,它們具有更低的全球變暖潛能值(GWP),成為替代
    的頭像 發表于 11-04 09:24 ?516次閱讀

    IPMSM電機驅動的無傳感器磁FOC和MTPA

    電子發燒友網站提供《IPMSM電機驅動的無傳感器磁FOC和MTPA.pdf》資料免費下載
    發表于 10-31 10:32 ?0次下載

    C語言與其他編程語言的比較

    C語言作為一種歷史悠久的編程語言,自其誕生以來,一直在軟件開發領域扮演著重要角色。它以其高效、靈活和可移植性的特點,成為了系統級編程的首選語言
    的頭像 發表于 10-29 17:30 ?885次閱讀

    成功榮登兩大榜單

    憑借其深厚的技術積累和創新能力,不斷推出高性能、高質量的產品和解決方案,成功榮登兩大榜單,這是對普卓越的技術實力和應用層面的肯定。
    的頭像 發表于 09-13 10:34 ?1495次閱讀

    請問信號前放輸出如何使用并聯放大器分為兩路?

    信號檢測,第一級為極低噪聲放大器,現想將該路輸出分為兩路,一路繼續放大,一路進行濾波處理。 但, 使用兩高輸入阻抗放大器,輸入相連,輸出分別接兩路,發現,均無輸出結果現象(爭用?) 使用兩低輸入阻抗放大器,輸入相連,輸出分別接兩路,發現,單獨一路后級均會影響并聯放大器
    發表于 09-09 07:53

    電機磁時的電流大小關系?

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

    宋仕論道之深圳華強北

    SlkorKinghelm華強北宋仕先生宋仕是薩科微半導體和金航標電子這兩家公司的總經理,在他的強力帶領下,薩科微和金航標的營收數據連續兩年超過100%的增長!宋仕先生發布“宋仕
    的頭像 發表于 06-27 08:12 ?1082次閱讀
    宋仕<b class='flag-5'>強</b>論道之深圳華強北

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

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

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

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