衡阳派盒市场营销有限公司

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

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

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

C語(yǔ)言強(qiáng)/弱符號(hào)和強(qiáng)/弱引用的作用

小麥大叔 ? 來(lái)源:小麥大叔 ? 作者:小麥大叔 ? 2022-07-12 11:55 ? 次閱讀

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

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

合理使用 __attribute__ 有什么好處?

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

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

強(qiáng)符號(hào)和弱符號(hào)

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

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

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

對(duì)于C/C++而言,編譯器默認(rèn)函數(shù)和已初始化的全局變量為強(qiáng)符號(hào),而未初始化的全局變量為弱符號(hào)。

編程者沒(méi)有顯示指定時(shí),編譯器對(duì)強(qiáng)弱符號(hào)的定義會(huì)有一些默認(rèn)行為,同時(shí)開(kāi)發(fā)者也可以對(duì)符號(hào)進(jìn)行指定,使用"attribute((weak))"來(lái)聲明一個(gè)符號(hào)為弱符號(hào)。

定義一個(gè)相同的變量,當(dāng)兩者不全是強(qiáng)符號(hào)時(shí),gcc在編譯時(shí)并不會(huì)報(bào)錯(cuò),而是遵循一定的規(guī)則進(jìn)行取舍:

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

在默認(rèn)的符號(hào)類(lèi)型情況下,強(qiáng)符號(hào)和弱符號(hào)是可以共存的,類(lèi)似于這樣:

intx;
intx=1;

編譯不會(huì)報(bào)錯(cuò),在編譯時(shí)x的取值將會(huì)是1.

注意,這里可以使用__attribute__((weak))將強(qiáng)符號(hào)轉(zhuǎn)換為弱符號(hào),卻不能與一個(gè)強(qiáng)符號(hào)共存,類(lèi)似于這樣:

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

編譯器將報(bào)重復(fù)定義錯(cuò)誤。

強(qiáng)引用和弱引用

除了強(qiáng)符號(hào)和弱符號(hào)的區(qū)別之外,GNUC還有一個(gè)特性就是強(qiáng)引用和弱引用。

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

編譯器默認(rèn)所有的變量和函數(shù)為強(qiáng)引用,同時(shí)編程者可以使用__attribute__((weakref))來(lái)聲明一個(gè)函數(shù)。

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

__attribute__((weakref))voidfunc(void);

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

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

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

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

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

強(qiáng)/弱符號(hào)和強(qiáng)/弱引用的作用

這種弱符號(hào)、弱引用的擴(kuò)展機(jī)制在庫(kù)的實(shí)現(xiàn)中非常有用。

我們?cè)趲?kù)中可以使用弱符號(hào)和弱引用機(jī)制,這樣對(duì)于一個(gè)弱符號(hào)函數(shù)而言,用戶(hù)可以自定義擴(kuò)展功能的函數(shù)來(lái)覆蓋這個(gè)弱符號(hào)函數(shù)。

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

如果用戶(hù)不進(jìn)行定義,則鏈接也不會(huì)報(bào)錯(cuò),這使得庫(kù)的功能可以很方便地進(jìn)行裁剪和組合。

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

審核編輯 :李倩


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

    關(guān)注

    180

    文章

    7614

    瀏覽量

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

    關(guān)注

    3

    文章

    4346

    瀏覽量

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

    關(guān)注

    1

    文章

    1642

    瀏覽量

    49286

原文標(biāo)題:C語(yǔ)言進(jìn)階小技巧,弱符號(hào)和弱引用

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    snmp口令及安全加固

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

    IPMSM電機(jī)驅(qū)動(dòng)的無(wú)傳感器磁FOC和MTPA

    電子發(fā)燒友網(wǎng)站提供《IPMSM電機(jī)驅(qū)動(dòng)的無(wú)傳感器磁FOC和MTPA.pdf》資料免費(fèi)下載
    發(fā)表于 10-31 10:32 ?0次下載

    4G5G手機(jī)信號(hào)放大器:從強(qiáng),為數(shù)字生活加速

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

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

    電機(jī)的相電流按矢量選擇分為勵(lì)磁電流和轉(zhuǎn)矩電流,勵(lì)磁電流用于產(chǎn)生磁場(chǎng),轉(zhuǎn)矩電流用于提供扭矩。 在電機(jī)磁時(shí),即到達(dá)恒功率區(qū)時(shí)刻,電機(jī)的勵(lì)磁電流開(kāi)始減小,這是因?yàn)橐?b class='flag-5'>弱磁,但是轉(zhuǎn)矩電流會(huì)增大,這是因?yàn)橐?/div>
    發(fā)表于 07-13 13:09

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

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

    什么是電機(jī)的磁?電機(jī)磁的可能原因有哪些?

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

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

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

    關(guān)于嵌入式C語(yǔ)言符號(hào)引用解析

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

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

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

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

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

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

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

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

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

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

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

    AI時(shí)代,存強(qiáng)強(qiáng)

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

    雙面布局貼補(bǔ)強(qiáng),F(xiàn)PC焊接很受傷

    顆是什么味道。 一大早,林如煙和趙理工剛來(lái)到辦公室、大師兄讓他們稍微整理下,就開(kāi)始講FPC補(bǔ)強(qiáng)的介紹、分類(lèi)、作用,特別是關(guān)于補(bǔ)強(qiáng)的案例,真的讓他們感慨事后諸葛亮,事前很迷茫。 什么是補(bǔ)強(qiáng)
    發(fā)表于 03-11 17:57
    大发888 网站被攻击了| 百家乐智能系统| 百家乐官网投注庄闲法| 威尼斯人娱乐城代理注册| 24山九宫飞星详解| 百家乐官网终端下载| 威尼斯人娱乐城注册网址| 属兔魔羯女在哪个方位做生意| 百家乐官网不倒翁缺点| 大发888赢钱最多的| 百家乐游戏客户端| 百家乐官网游戏唯一官网网站| 网上真钱梭哈| 澳门赌百家乐的玩法技巧和规则| 百家乐官网必赢外挂软件| G3娱乐城| 威尼斯人娱乐平台官网| 百家乐软件编辑原理| 最新百家乐官网出千赌具| 清水县| 威尼斯人娱乐网上百家乐的玩法技巧和规则| 百家乐有免费玩| 百家乐官网投注窍门| 三宝娱乐| 赌王百家乐官网的玩法技巧和规则 | 黄金城百家乐官网手机用户| 新濠百家乐官网现金网| 金冠娱乐城 安全吗| 谁会玩百家乐的玩法技巧和规则| 24山向方位度数| 莆田棋牌游戏下载| 百家乐长胜攻略| 全讯网百家乐官网的玩法技巧和规则| 百家乐官网信誉平台开户| 大发888官方 df888| 模拟百家乐的玩法技巧和规则 | 百家乐揽法大全| 百家乐官网免费试玩游戏| 百家乐赌博机| 大发888作弊| 中国百家乐澳门真人娱乐平台网址|