一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

一套完全自由的操作系統(tǒng)都有這個(gè)秘密

UtFs_Zlgmcu7890 ? 來(lái)源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-09-27 13:56 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

GNU計(jì)劃,又稱(chēng)革奴計(jì)劃,是由Richard Stallman1983927日公開(kāi)發(fā)起的。它的目標(biāo)是創(chuàng)建一套完全自由的操作系統(tǒng),它在編寫(xiě)Linux的時(shí)候自己制作了一個(gè)標(biāo)準(zhǔn)成為GNU C標(biāo)準(zhǔn),但是作為GNU C一大特色的__attribute__機(jī)制卻為許多人所不知,現(xiàn)在讓我們一起走進(jìn)__attribute__的世界,來(lái)揭開(kāi)它的神秘面紗。

對(duì)于GNU C的__attribute__機(jī)制,它有什么神奇的作用呢?你們是不是已經(jīng)迫不及待了,對(duì)于__attribute__它可以修飾變量屬性和函數(shù)屬性,它的語(yǔ)法格式為:“__attribute__((參數(shù)));”,下面我們慢慢道來(lái)。

當(dāng)我們初次學(xué)習(xí)一門(mén)語(yǔ)言的時(shí)候,都會(huì)寫(xiě)一個(gè)很經(jīng)典的程序,沒(méi)錯(cuò)就是在屏幕上輸出Hello world,現(xiàn)在對(duì)我們來(lái)說(shuō)寫(xiě)一段hello world程序,都是順手捏來(lái)的事了,那么你看過(guò)這樣的Hello world嗎?

#include

#include

__attribute__((constructor())) void pre_proc_1(void)

{

printf("\nhello world\n");

}

__attribute__((destructor())) void end_proc_1(void)

{

printf("\nHello World\n",__LINE__);

}

int main(int args,char **argv)

{

return 0;

}

可以猜到程序輸出什么結(jié)果嗎?沒(méi)錯(cuò)也是輸出Hello world,直到為什么這樣嗎?細(xì)心的人肯定看到了在兩個(gè)子函數(shù)前面使用了__attribute__((constructor()))和__attribute__((destructor))來(lái)修飾子函數(shù),那么它們的作用是什么意思呢?被__attribute__((constructor()))修飾的函數(shù)在主函數(shù)前執(zhí)行,__attribute__((destructor()))修飾的函數(shù)在主函數(shù)后執(zhí)行,我們還可以在__attribute__((constructor(101)))在數(shù)字,括號(hào)中的數(shù)字代表函數(shù)的優(yōu)先級(jí),這樣我們就可以安排我們函數(shù)執(zhí)行的順序了,一般0-100為系統(tǒng)使用,我們可以使用100以后的數(shù)字,在VC下也有這個(gè)屬性但是不能添加數(shù)字作為優(yōu)先級(jí),但是我們可以安排我們函數(shù)的聲明順序來(lái)實(shí)現(xiàn)函數(shù)的執(zhí)行順序。

經(jīng)過(guò)一個(gè)簡(jiǎn)單有意思的程序,下面我們繼續(xù)來(lái)說(shuō)__attribute__機(jī)制,在前面說(shuō)道__attribute__可以修飾變量和函數(shù)屬性,下面總結(jié)了如何使用__attribute__來(lái)修飾變量和函數(shù),讓我們一起來(lái)感受它的神奇。

函數(shù)屬性

(1)__attribute__((format(archtype,string-index,first-to-check)));

format屬性告訴表達(dá)式按照printf,scanf,strftime,strfmom參數(shù)表格式規(guī)則對(duì)該函數(shù)的參數(shù)進(jìn)行檢查。

例:

__attribute__((format(printf,m,n)));

__attribute__((format(scanf,m,n)));

m:第幾個(gè)參數(shù)為格式化字符

n;在參數(shù)集合中排在第幾

(2)__attribute__((noreturn));

該屬性通知編譯器從不返回值,當(dāng)遇到類(lèi)似函數(shù)需要返回值卻不可能運(yùn)行到返回值就已經(jīng)退出的情況該屬性可以避免出現(xiàn)錯(cuò)誤信息,例如C語(yǔ)言中的abort()和exit()函數(shù)就使用到了該屬性。

(3)__attribute__((const));

該屬性只能用于帶有數(shù)值類(lèi)型參數(shù)的函數(shù)上,當(dāng)反復(fù)調(diào)用帶有數(shù)值參數(shù)的函數(shù)時(shí),由于返回值是相同的,所以編譯器可以進(jìn)行優(yōu)化處理,除第一次需要運(yùn)算外,其他只需返回第一次運(yùn)行的結(jié)果,進(jìn)而再快了執(zhí)行效率。

(4)Noinline & always_line

Nolinline為不內(nèi)聯(lián),always_line為總是內(nèi)聯(lián),我們?cè)谑褂胕nline什么內(nèi)聯(lián)函數(shù)時(shí),函數(shù)能否成為內(nèi)聯(lián)函數(shù),還要看編譯器的具體操作,使用noinline和always_line可以告訴編譯器是否執(zhí)行內(nèi)聯(lián)。

(5)看了前面的常用屬性,你們可能會(huì)問(wèn)到可以在同一個(gè)函數(shù)中使用多個(gè)參數(shù)嗎?回答是肯定,并且這在實(shí)際中也是非常有用的。

變量屬性

(1)__attribute__((aligned(n)));

例:

int a __attribute__((aligned(16))) = 0;

變量a將以16位對(duì)齊,我們也可以不加數(shù)字,如__attribute__((aligned));這樣編譯器會(huì)根據(jù)目標(biāo)機(jī)器的情況實(shí)現(xiàn)對(duì)齊。它不僅可以修飾單個(gè)變量,也可以修飾符合變量如結(jié)構(gòu)體,聯(lián)合等,在實(shí)際中會(huì)用于修飾結(jié)構(gòu)體,是結(jié)構(gòu)體中的成員按一定的方式字節(jié)對(duì)齊。

(2)__attribute__((packed));

例:

int a[10] __attribute__((packed));

前面說(shuō)了字節(jié)對(duì)齊屬性,有的編譯會(huì)默認(rèn)使用一種字節(jié)對(duì)齊方式,假如我們不想使用字節(jié)對(duì)齊該怎么做呢?該屬性就起到了這個(gè)作用,使用packed可以取消字節(jié)對(duì)齊方式。

(3)__attribute__((at(address));

例:

int a __attribute__((at(0x00));

在一些特殊的情況,我們需要將某個(gè)變量存放特定的位置時(shí),該屬性就起到了作用,該屬性的作用就是將變量a存儲(chǔ)到絕對(duì)地址為0x00的位置處。

(4)__attribute__((section(“section_name”)));

例如:

int a(void) __attribute__((seciton(abc));

說(shuō)了前面的at屬性,現(xiàn)在我們來(lái)說(shuō)seciton屬性,他和at有些相同,他的作用是將作用的函數(shù)或指定的數(shù)據(jù)放入指定名為Section_name的段中,一般在匯編文件中我們會(huì)使用到。

(5)__attribute__((cleanup(函數(shù)名)))

該屬性來(lái)修飾一個(gè)變量,當(dāng)變量的作用域結(jié)束時(shí),調(diào)用一個(gè)指定的函數(shù)。

例如:

void print()(printf(“\nend\n”);

void text()

{

Int a __attribute__((cleanup(print))) = 10;

}

看了這么多屬性的作用,大家是否感覺(jué)到了GNU編譯器的神奇呢?對(duì)于__attribute__關(guān)鍵字,大家是否有了更進(jìn)一步的認(rèn)識(shí)呢?

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

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213748
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7147

    瀏覽量

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

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50208

原文標(biāo)題:__attribute__ 你不知道的秘密

文章出處:【微信號(hào):Zlgmcu7890,微信公眾號(hào):周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    Linux系統(tǒng)中多個(gè)同類(lèi)設(shè)備共用一套驅(qū)動(dòng)

    比如我們的設(shè)備上有很多樣的usb接口,這些usb接口都需要有驅(qū)動(dòng)才能工作,那么是每個(gè)usb都一套單獨(dú)的驅(qū)動(dòng)程序么?顯然不是的,這些usb接口屬于同類(lèi)設(shè)備,用戶(hù)對(duì)他們的操作方法
    發(fā)表于 08-30 09:29 ?1346次閱讀
    Linux<b class='flag-5'>系統(tǒng)</b>中多個(gè)同類(lèi)設(shè)備共用<b class='flag-5'>一套</b>驅(qū)動(dòng)

    手機(jī)操作系統(tǒng)成功的秘密

    和Android成功了?為什么Bada有三星這么強(qiáng)大的硬件支持依然被邊緣化?手機(jī)操作系統(tǒng)成功的秘密又是什么呢?、iOS的成功我們先來(lái)看下成功的
    發(fā)表于 07-12 08:37

    關(guān)于國(guó)內(nèi)實(shí)時(shí)操作系統(tǒng)的接口標(biāo)準(zhǔn)統(tǒng)

    。具體說(shuō)明如下: 1 定義一套實(shí)時(shí)操作系統(tǒng)的抽象層接口。這套抽象層接口首先要能滿(mǎn)足國(guó)外的些主流實(shí)時(shí)系統(tǒng)的封裝。比如: task_create_cn(……….){Ucos3_task_
    發(fā)表于 06-01 10:13

    【Aworks申請(qǐng)】物聯(lián)網(wǎng)操作系統(tǒng)

    。為了解決這個(gè)問(wèn)題,我決定邊學(xué)習(xí)邊開(kāi)發(fā)一套全新的輕量級(jí)的操作系統(tǒng)。項(xiàng)目描述:我將這個(gè)物聯(lián)網(wǎng)
    發(fā)表于 07-09 11:04

    什么是UNIX操作系統(tǒng)

    @TOC嵌入式方向在校目前所學(xué)到的知識(shí)**歡迎使用Markdown編輯器Linux概述linux是一套免費(fèi)使用和自由傳播的類(lèi)UNIX操作系統(tǒng)。對(duì)于類(lèi)UNIX操作系統(tǒng),我并不是很了解,通
    發(fā)表于 11-04 07:29

    分享一套通用的開(kāi)發(fā)環(huán)境搭建教程

    針對(duì)嵌入式的開(kāi)發(fā),不同的開(kāi)發(fā)者使用不同的操作系統(tǒng),可能是Windows 或者 Linux,隨之而來(lái)所搭建的開(kāi)發(fā)環(huán)境亦不同。所以在這里希望分享一套通用的開(kāi)發(fā)環(huán)境搭建教程,主要是圍繞VS Code以及
    發(fā)表于 11-05 06:23

    什么是Linux操作系統(tǒng)

    什么是Linux操作系統(tǒng)  簡(jiǎn)單地說(shuō),Linux是一套
    發(fā)表于 12-26 12:04 ?1440次閱讀

    Linux操作系統(tǒng)基本使用知識(shí),Linux操作系統(tǒng)操作流程圖文詳解

    Linux系統(tǒng)一般有4個(gè)主要部分:內(nèi)核、shell、文件系統(tǒng)和應(yīng)用程序。內(nèi)核、shell和文件系統(tǒng)一起形成了基本的操作系統(tǒng)結(jié)構(gòu),它們使得用戶(hù)可以運(yùn)行程序、管理文件并使用
    發(fā)表于 11-24 16:19 ?1.9w次閱讀
    Linux<b class='flag-5'>操作系統(tǒng)</b>基本使用知識(shí),Linux<b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>操作</b>流程圖文詳解

    Linux操作系統(tǒng)在定制PMP DM320的應(yīng)用解析

    Linux是一套免費(fèi)使用和自由傳播的類(lèi)Unix操作系統(tǒng),是個(gè)基于POSIX和UNIX的多用戶(hù)、多任務(wù)、支持多線(xiàn)程和多CPU的操作系統(tǒng)。PM
    發(fā)表于 11-30 14:21 ?1049次閱讀

    微軟全新操作系統(tǒng)正在開(kāi)發(fā) 或在5月Build大會(huì)亮相

    關(guān)于微軟全新的一套操作系統(tǒng)Windows Lite有了新的動(dòng)態(tài)。
    的頭像 發(fā)表于 03-05 09:07 ?2268次閱讀

    APL庫(kù)是一套AS功能庫(kù)與OS操作對(duì)象的集合

    首先,在AS控制器側(cè),它是個(gè)MotL功能塊(Function Block);在OS側(cè),它卻是此功能塊對(duì)應(yīng)的電機(jī)圖標(biāo)(Block Icon)和一套操作面板(Faceplate),APL定義了
    的頭像 發(fā)表于 12-05 14:31 ?6403次閱讀
    APL庫(kù)是<b class='flag-5'>一套</b>AS功能庫(kù)與OS<b class='flag-5'>操作</b>對(duì)象的集合

    Linux操作系統(tǒng)的詳細(xì)安裝步驟

    Linux是一套免費(fèi)使用和自由傳播的操作系統(tǒng),它主要用于基于Intel x86系列CPU的計(jì)算機(jī)上。這個(gè)系統(tǒng)是由全世界各地的成千上萬(wàn)的程序員
    發(fā)表于 07-16 11:39 ?4840次閱讀

    一套成熟的MES系統(tǒng)能賣(mài)多少錢(qián)

    對(duì)于MES系統(tǒng)價(jià)格來(lái)說(shuō),相信很多企業(yè)都給不出個(gè)確定的答案,畢竟現(xiàn)在的MES系統(tǒng)市場(chǎng)上類(lèi)型較多,功能不,幾萬(wàn)到幾百萬(wàn)的系統(tǒng)比比皆是,但是要
    發(fā)表于 09-30 17:45 ?3637次閱讀

    一套系統(tǒng)的網(wǎng)絡(luò)排錯(cuò)方法

    為什么要先講必備條件?因?yàn)檫@里所講的網(wǎng)絡(luò)排錯(cuò)并不僅僅是停留在某個(gè)小小命令的使用上,而是一套系統(tǒng)的方法,如果沒(méi)有這些條件,真的不能保證下面聊的這些可以聽(tīng)得懂,并且能運(yùn)用到實(shí)際當(dāng)中,所以
    的頭像 發(fā)表于 11-10 09:56 ?936次閱讀

    linux屬于什么操作系統(tǒng)

    Linux屬于種類(lèi)UNIX操作系統(tǒng)。Linux,全稱(chēng)GNU/Linux,是一套免費(fèi)使用和自由傳播的類(lèi)Unix操作系統(tǒng),是
    的頭像 發(fā)表于 11-08 11:01 ?6058次閱讀