99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

當我們初次學習一門語言的時候,都會寫一個很經典的程序,沒錯就是在屏幕上輸出Hello world,現(xiàn)在對我們來說寫一段hello world程序,都是順手捏來的事了,那么你看過這樣的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;

}

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

經過一個簡單有意思的程序,下面我們繼續(xù)來說__attribute__機制,在前面說道__attribute__可以修飾變量和函數(shù)屬性,下面總結了如何使用__attribute__來修飾變量和函數(shù),讓我們一起來感受它的神奇。

函數(shù)屬性

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

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

例:

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

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

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

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

(2)__attribute__((noreturn));

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

(3)__attribute__((const));

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

(4)Noinline & always_line

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

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

變量屬性

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

例:

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

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

(2)__attribute__((packed));

例:

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

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

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

例:

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

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

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

例如:

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

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

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

該屬性來修飾一個變量,當變量的作用域結束時,調用一個指定的函數(shù)。

例如:

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

void text()

{

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

}

看了這么多屬性的作用,大家是否感覺到了GNU編譯器的神奇呢?對于__attribute__關鍵字,大家是否有了更進一步的認識呢?

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

    關注

    87

    文章

    11511

    瀏覽量

    213864
  • 操作系統(tǒng)

    關注

    37

    文章

    7152

    瀏覽量

    125624
  • 編譯器
    +關注

    關注

    1

    文章

    1662

    瀏覽量

    50232

原文標題:__attribute__ 你不知道的秘密

文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux系統(tǒng)中多個同類設備共用一套驅動

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

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

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

    關于國內實時操作系統(tǒng)的接口標準統(tǒng)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    APL庫是一套AS功能庫與OS操作對象的集合

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

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

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

    一套成熟的MES系統(tǒng)能賣多少錢

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

    一套系統(tǒng)的網絡排錯方法

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

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

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