91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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í)者都理所當然地這么認為。

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

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

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

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

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

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

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

intx;
intx=1;

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

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

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

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

強引用和弱引用

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

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

編譯器默認所有的變量和函數(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ù)定義為弱引用,當用戶需要使用擴展功能時,就對其進行定義,鏈接到程序當中。

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

注意:C標準里根本沒有提到強、弱符號。這只是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)注

    183

    文章

    7644

    瀏覽量

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

    關(guān)注

    3

    文章

    4417

    瀏覽量

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

    關(guān)注

    1

    文章

    1672

    瀏覽量

    51597

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    薩科微slkor總經(jīng)理宋仕介紹道,焊接層在IGBT模塊中起什么作用?其失效會帶來什么后果?

    薩科微slkor總經(jīng)理宋仕介紹道,焊接層在IGBT模塊中起什么作用?其失效會帶來什么后果?作用:焊接層是 IGBT 模塊內(nèi)部電氣互聯(lián)與熱傳導(dǎo)的核心介質(zhì),實現(xiàn)芯片與基板、基板與底板的可靠連接。失效
    發(fā)表于 02-02 13:47

    聯(lián)創(chuàng)電子榮登2025江西企業(yè)100榜單

    11月21日,江西省企業(yè)聯(lián)合會、省企業(yè)家協(xié)會發(fā)布“2025江西企業(yè)100”榜單,并首次推出“2025江西制造業(yè)企業(yè)100”“2025江西服務(wù)業(yè)企業(yè)60”“2025江西戰(zhàn)略性新興產(chǎn)業(yè)企業(yè)60
    的頭像 發(fā)表于 12-01 15:53 ?549次閱讀

    C語言的常量介紹

    在程序執(zhí)行過程中,值不發(fā)生改變的量稱為常量。 mtianyan: C語言的常量可以分為直接常量和符號常量。 直接常量也稱為字面量,是可以直接拿來使用,無需說明的量,比如: 整型常量:13、0
    發(fā)表于 11-24 07:12

    傳音控股榮登2025廣東企業(yè)500榜單

    10月29日,廣東省企業(yè)聯(lián)合會、廣東省企業(yè)家協(xié)會(簡稱“省企聯(lián)”)在廣州召開新聞發(fā)布會,正式發(fā)布了“2025廣東企業(yè)500”等榜單及相關(guān)分析報告。傳音控股入選“2025廣東企業(yè)500”榜單,位列
    的頭像 發(fā)表于 10-31 09:40 ?359次閱讀

    信號樣品在比表面與孔徑分析中的數(shù)據(jù)處理與增強技巧

    在比表面與孔徑分析中,信號樣品(如低比表面積材料、微量樣品或低孔隙率材料)因吸附信號微弱,易被背景干擾掩蓋,導(dǎo)致數(shù)據(jù)精度下降甚至無法準確分析。這類樣品的分析核心在于“精準捕捉有效信號” 與 “科學(xué)
    的頭像 發(fā)表于 10-29 09:32 ?292次閱讀
    <b class='flag-5'>弱</b>信號樣品在比表面與孔徑分析中的數(shù)據(jù)處理與增強技巧

    福晶科技PLI吸收測試儀成功交付北京某研究所

    近日,福晶科技研制的PLI吸收測試儀成功交付北京某研究所。這是繼該設(shè)備獲國家級科研單位引進后,又一次成功交付國內(nèi)權(quán)威科研機構(gòu)。
    的頭像 發(fā)表于 09-04 16:00 ?782次閱讀

    FX3是否支持配置一個GPIO引腳作為一個下拉的輸入?

    FX3是否支持配置一個GPIO引腳作為一個下拉的輸入?如果可以的話,這將如何完成?#CYUSB3014
    發(fā)表于 08-11 07:47

    德思特案例 | 一套設(shè)備兼容四大測試場景:全面解析網(wǎng)測試方案

    隨著用戶對網(wǎng)絡(luò)體驗要求的不斷提升,網(wǎng)環(huán)境下的穩(wěn)定性已不再是“加分項”,而是終端產(chǎn)品必須具備的“基本功”。德思特通過現(xiàn)網(wǎng)模擬 + 參數(shù)可控 + 自動化測試 + 創(chuàng)新硬件設(shè)計,為行業(yè)提供了一套完整、可復(fù)用、可擴展的網(wǎng)測試解決方案。
    的頭像 發(fā)表于 08-08 10:47 ?984次閱讀
    德思特案例 | 一套設(shè)備兼容四大測試場景:全面解析<b class='flag-5'>弱</b>網(wǎng)測試方案

    無位置傳感器直流無刷電機磁調(diào)速控制的優(yōu)化

    在無位置傳感器直流無刷電機的磁控制過程中,隨著礁程度加深,電流波動會越來越嚴重,導(dǎo)致電機電礁轉(zhuǎn)矩波動的厲害。實驗表明,不同的 PWIM 控制方式會使得電流波動的大小不同。從理論上分析為什么PWM
    發(fā)表于 08-04 14:51

    無刷電機磁控制:技術(shù)原理與實戰(zhàn)應(yīng)用

    在電機控制領(lǐng)域,磁控制技術(shù)一直是備受關(guān)注的焦點之一。尤其是對于無刷電機來說,磁控制不僅能夠提升其性能,還能拓展其應(yīng)用范圍。今天,就讓我們深入探討一下無刷電機磁控制的奧秘以及它所帶來的諸多
    的頭像 發(fā)表于 08-01 18:05 ?9706次閱讀
    無刷電機<b class='flag-5'>弱</b>磁控制:技術(shù)原理與實戰(zhàn)應(yīng)用

    無位置傳感器方波無刷直流電機及磁控制

    樂器電勢抵消激磁電勢而實現(xiàn)的等效磁控制方法,并作理論分析與實驗驗證。 純分享帖,點擊下方附件免費獲取完整資料~~~ 內(nèi)容有幫助可以關(guān)注、點贊、評論支持一下,謝謝! 【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請第一時間告知,刪除內(nèi)容,謝謝!
    發(fā)表于 08-01 12:39

    上汽集團入選2025年財富世界500

    《財富》雜志于北京時間7月29日公布了2025年世界500排行榜。上汽集團以2024年度合并報表872.239億美元的營業(yè)收入名列世界500第138位,第二十一次進入世界500排行榜。
    的頭像 發(fā)表于 07-31 15:44 ?1005次閱讀

    C語言精彩編程百例-364頁

    內(nèi)容提要 C是一種通用的程序設(shè)計語言,它包含了緊湊的表達式、豐富的運算符集合、現(xiàn)代控制流以及數(shù)據(jù)結(jié)構(gòu)等四個部分。C語言功能豐富,衣達能力,
    發(fā)表于 06-13 17:28

    福晶科技PLI吸收測試儀成功交付客戶

    佳音再至,福晶科技自主研發(fā)的PLI吸收測試儀成功交付中國科學(xué)院某研究所。該設(shè)備集成了1064 nm、532 nm、355 nm和266 nm四個波長的泵浦光源,可精準檢測晶體吸收特性,為新型晶體尤其是紫外晶體的開發(fā)和性能研究提供關(guān)鍵技術(shù)支撐。
    的頭像 發(fā)表于 06-10 17:47 ?1215次閱讀

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

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