• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

              C++博客 :: 首頁(yè) :: 聯(lián)系 ::  :: 管理
              163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(48)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 401327
            • 排名 - 59

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            在所有的預(yù)處理指令中,#pragma 指令可能是最復(fù)雜的了,它的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動(dòng)作。
            #pragma指令對(duì)每個(gè)編譯器給出了一個(gè)方法,在保持與C和C++語(yǔ)言完全兼容的情況下,給出主機(jī)或操作系統(tǒng)專(zhuān)有的特征。
            依據(jù)定義,編譯指示是機(jī)器或操作系統(tǒng)專(zhuān)有的,且對(duì)于每個(gè)編譯器都是不同的。
                其格式一般為: #pragma para
                其中para為參數(shù),下面來(lái)看一些常用的參數(shù)。

            (1)message 參數(shù)

                message參數(shù)是我最喜歡的一個(gè)參數(shù),它能夠在編譯信息輸出窗口中輸出相應(yīng)的信息,
            這對(duì)于源代碼信息的控制是非常重要的。其使用方法為:
                #pragma message("消息文本")
                當(dāng)編譯器遇到這條指令時(shí)就在編譯輸出窗口中將消息文本打印出來(lái)。
                當(dāng)我們?cè)诔绦蛑卸x了許多宏來(lái)控制源代碼版本的時(shí)候,我們自己有可能都會(huì)忘記有沒(méi)有正確的設(shè)置這些宏,
            此時(shí)我們可以用這條指令在編譯的時(shí)候就進(jìn)行檢查。假設(shè)我們希望判斷自己有沒(méi)有在源代碼的什么地方定義了_X86這個(gè)宏,
            可以用下面的方法:
                #ifdef _X86
                #pragma message("_X86 macro activated!")
                #endif
                我們定義了_X86這個(gè)宏以后,應(yīng)用程序在編譯時(shí)就會(huì)在編譯輸出窗口里顯示"_86 macro activated!"。
            我們就不會(huì)因?yàn)椴挥浀米约憾x的一些特定的宏而抓耳撓腮了。
                  
            (2)另一個(gè)使用得比較多的pragma參數(shù)是code_seg

                格式如:
                #pragma code_seg( ["section-name" [, "section-class"] ] )
                它能夠設(shè)置程序中函數(shù)代碼存放的代碼段,當(dāng)我們開(kāi)發(fā)驅(qū)動(dòng)程序的時(shí)候就會(huì)使用到它。

            (3)#pragma once (比較常用)

                只要在頭文件的最開(kāi)始加入這條指令就能夠保證頭文件被編譯一次,這條指令實(shí)際上在VC6中就已經(jīng)有了,
            但是考慮到兼容性并沒(méi)有太多的使用它。

            (4)#pragma hdrstop

                表示預(yù)編譯頭文件到此為止,后面的頭文件不進(jìn)行預(yù)編譯。BCB可以預(yù)編譯頭文件以加快鏈接的速度,
            但如果所有頭文件都進(jìn)行預(yù)編譯又可能占太多磁盤(pán)空間,所以使用這個(gè)選項(xiàng)排除一些頭文件。   
                有時(shí)單元之間有依賴(lài)關(guān)系,比如單元A依賴(lài)單元B,所以單元B要先于單元A編譯。
            你可以用#pragma startup指定編譯優(yōu)先級(jí),如果使用了#pragma package(smart_init),
            BCB就會(huì)根據(jù)優(yōu)先級(jí)的大小先后編譯。   

            (5)#pragma resource "*.dfm"

                表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體
            外觀的定義。   

            (6)#pragma warning( disable: 4507 34; once: 4385; error: 164 )

                等價(jià)于:
                #pragma warning( disable: 4507 34 )    // 不顯示4507和34號(hào)警告信息
                #pragma warning( once: 4385 )          // 4385號(hào)警告信息僅報(bào)告一次
                #pragma warning( error: 164 )          // 把164號(hào)警告信息作為一個(gè)錯(cuò)誤。

                同時(shí)這個(gè)pragma warning 也支持如下格式:
                #pragma warning( push [, n ] )
                #pragma warning( pop )
                這里n代表一個(gè)警告等級(jí)(1---4)。
                #pragma warning( push )保存所有警告信息的現(xiàn)有的警告狀態(tài)。
                #pragma warning( push, n )保存所有警告信息的現(xiàn)有的警告狀態(tài),并且把全局警告等級(jí)設(shè)定為n。   
                #pragma warning( pop )向棧中彈出最后一個(gè)警告信息,在入棧和出棧之間所作的一切改動(dòng)取消。例如:
                #pragma warning( push )
                #pragma warning( disable: 4705 )
                #pragma warning( disable: 4706 )
                #pragma warning( disable: 4707 )
                //.......
                #pragma warning( pop )   
                在這段代碼的最后,重新保存所有的警告信息(包括4705,4706和4707)。

            (7)#pragma comment(...)

                該指令將一個(gè)注釋記錄放入一個(gè)對(duì)象文件或可執(zhí)行文件中。
            常用的lib關(guān)鍵字,可以幫我們連入一個(gè)庫(kù)文件。如:
                #pragma comment(lib, "comctl32.lib")
                #pragma comment(lib, "vfw32.lib")
                #pragma comment(lib, "wsock32.lib")

               每個(gè)編譯程序可以用#pragma指令激活或終止該編譯程序支持的一些編譯功能。

            例如,對(duì)循環(huán)優(yōu)化功能:
            #pragma loop_opt(on)     // 激活
            #pragma loop_opt(off)    // 終止

            有時(shí),程序中會(huì)有些函數(shù)會(huì)使編譯器發(fā)出你熟知而想忽略的警告,
            如“Parameter xxx is never used in function xxx”,可以這樣:
            #pragma warn —100         // Turn off the warning message for warning #100
            int insert_record(REC *r)
            { /* function body */ }
            #pragma warn +100          // Turn the warning message for warning #100 back on
            函數(shù)會(huì)產(chǎn)生一條有唯一特征碼100的警告信息,如此可暫時(shí)終止該警告。

            每個(gè)編譯器對(duì)#pragma的實(shí)現(xiàn)不同,在一個(gè)編譯器中有效在別的編譯器中幾乎無(wú)效。可從編譯器的文檔中查看。

            補(bǔ)充 —— #pragma pack 與 內(nèi)存對(duì)齊問(wèn)題


                許多實(shí)際的計(jì)算機(jī)系統(tǒng)對(duì)基本類(lèi)型數(shù)據(jù)在內(nèi)存中存放的位置有限制,它們會(huì)要求這些數(shù)據(jù)的首地址的值是某個(gè)數(shù)k
            (通常它為4或8)的倍數(shù),這就是所謂的內(nèi)存對(duì)齊,而這個(gè)k則被稱(chēng)為該數(shù)據(jù)類(lèi)型的對(duì)齊模數(shù)(alignment modulus)。

                Win32平臺(tái)下的微軟C編譯器(cl.exe for 80x86)在默認(rèn)情況下采用如下的對(duì)齊規(guī)則:
                任何基本數(shù)據(jù)類(lèi)型T的對(duì)齊模數(shù)就是T的大小,即sizeof(T)。比如對(duì)于double類(lèi)型(8字節(jié)),
            就要求該類(lèi)型數(shù)據(jù)的地址總是8的倍數(shù),而char類(lèi)型數(shù)據(jù)(1字節(jié))則可以從任何一個(gè)地址開(kāi)始。

                Linux下的GCC奉行的是另外一套規(guī)則(在資料中查得,并未驗(yàn)證,如錯(cuò)誤請(qǐng)指正):
                任何2字節(jié)大小(包括單字節(jié)嗎?)的數(shù)據(jù)類(lèi)型(比如short)的對(duì)齊模數(shù)是2,而其它所有超過(guò)2字節(jié)的數(shù)據(jù)類(lèi)型
            (比如long,double)都以4為對(duì)齊模數(shù)。

                ANSI C規(guī)定一種結(jié)構(gòu)類(lèi)型的大小是它所有字段的大小以及字段之間或字段尾部的填充區(qū)大小之和。
            填充區(qū)就是為了使結(jié)構(gòu)體字段滿足內(nèi)存對(duì)齊要求而額外分配給結(jié)構(gòu)體的空間。那么結(jié)構(gòu)體本身有什么對(duì)齊要求嗎?
            有的,ANSI C標(biāo)準(zhǔn)規(guī)定結(jié)構(gòu)體類(lèi)型的對(duì)齊要求不能比它所有字段中要求最嚴(yán)格的那個(gè)寬松,可以更嚴(yán)格。


            如何使用c/c++中的對(duì)齊選項(xiàng)

                vc6中的編譯選項(xiàng)有 /Zp[1|2|4|8|16] ,/Zp1表示以1字節(jié)邊界對(duì)齊,相應(yīng)的,/Zpn表示以n字節(jié)邊界對(duì)齊。
            n字節(jié)邊界對(duì)齊的意思是說(shuō),一個(gè)成員的地址必須安排在成員的尺寸的整數(shù)倍地址上或者是n的整數(shù)倍地址上,取它們中的最小值。
            也就是:
                min ( sizeof ( member ), n)

                實(shí)際上,1字節(jié)邊界對(duì)齊也就表示了結(jié)構(gòu)成員之間沒(méi)有空洞。
                /Zpn選項(xiàng)是應(yīng)用于整個(gè)工程的,影響所有的參與編譯的結(jié)構(gòu)。
                要使用這個(gè)選項(xiàng),可以在vc6中打開(kāi)工程屬性頁(yè),c/c++頁(yè),選擇Code Generation分類(lèi),在Struct member alignment可以選擇。

                要專(zhuān)門(mén)針對(duì)某些結(jié)構(gòu)定義使用對(duì)齊選項(xiàng),可以使用#pragma pack編譯指令:

            (1) #pragma pack( [ n ] )

                該指令指定結(jié)構(gòu)和聯(lián)合成員的緊湊對(duì)齊。而一個(gè)完整的轉(zhuǎn)換單元的結(jié)構(gòu)和聯(lián)合的緊湊對(duì)齊由/Zp 選項(xiàng)設(shè)置。
            緊湊對(duì)齊用pack編譯指示在數(shù)據(jù)說(shuō)明層設(shè)置。該編譯指示在其出現(xiàn)后的第一個(gè)結(jié)構(gòu)或聯(lián)合說(shuō)明處生效。
            該編譯指示對(duì)定義無(wú)效。
                當(dāng)你使用#pragma pack ( n ) 時(shí), 這里n 為1、2、4、8 或16。
                第一個(gè)結(jié)構(gòu)成員之后的每個(gè)結(jié)構(gòu)成員都被存儲(chǔ)在更小的成員類(lèi)型或n 字節(jié)界限內(nèi)。
            如果你使用無(wú)參量的#pragma pack, 結(jié)構(gòu)成員被緊湊為以/Zp 指定的值。該缺省/Zp 緊湊值為/Zp8 。

            (2) 編譯器也支持以下增強(qiáng)型語(yǔ)法:
                #pragma pack( [ [ { push | pop } , ] [ identifier, ] ] [ n] )

                若不同的組件使用pack編譯指示指定不同的緊湊對(duì)齊, 這個(gè)語(yǔ)法允許你把程序組件組合為一個(gè)單獨(dú)的轉(zhuǎn)換單元。
            帶push參量的pack編譯指示的每次出現(xiàn)將當(dāng)前的緊湊對(duì)齊存儲(chǔ)到一個(gè)內(nèi)部編譯器堆棧中。
                編譯指示的參量表從左到右讀取。如果你使用push, 則當(dāng)前緊湊值被存儲(chǔ)起來(lái);
            如果你給出一個(gè)n 的值, 該值將成為新的緊湊值。若你指定一個(gè)標(biāo)識(shí)符, 即你選定一個(gè)名稱(chēng),
            則該標(biāo)識(shí)符將和這個(gè)新的的緊湊值聯(lián)系起來(lái)。

                帶一個(gè)pop參量的pack編譯指示的每次出現(xiàn)都會(huì)檢索內(nèi)部編譯器堆棧頂?shù)闹?并且使該值為新的緊湊對(duì)齊值。
            如果你使用pop參量且內(nèi)部編譯器堆棧是空的,則緊湊值為命令行給定的值, 并且將產(chǎn)生一個(gè)警告信息。
            若你使用pop且指定一個(gè)n的值, 該值將成為新的緊湊值。若你使用p o p 且指定一個(gè)標(biāo)識(shí)符,
            所有存儲(chǔ)在堆棧中的值將從棧中刪除, 直到找到一個(gè)匹配的標(biāo)識(shí)符, 這個(gè)與標(biāo)識(shí)符相關(guān)的緊湊值也從棧中移出,
            并且這個(gè)僅在標(biāo)識(shí)符入棧之前存在的緊湊值成為新的緊湊值。如果未找到匹配的標(biāo)識(shí)符,
            將使用命令行設(shè)置的緊湊值, 并且將產(chǎn)生一個(gè)一級(jí)警告。缺省緊湊對(duì)齊為8 。

               pack編譯指示的新的增強(qiáng)功能讓你編寫(xiě)頭文件, 確保在遇到該頭文件的前后的
            緊湊值是一樣的。

            (3) 棧內(nèi)存對(duì)齊

                在vc6中棧的對(duì)齊方式不受結(jié)構(gòu)成員對(duì)齊選項(xiàng)的影響。它總是保持對(duì)齊,而且對(duì)齊在4字節(jié)邊界上。


            posted on 2007-12-24 09:40 sdfasdf 閱讀(663) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): C++

            Feedback

            # re: pragma預(yù)處理指令詳解 2008-01-04 12:26 FongLuo
            有意思  回復(fù)  更多評(píng)論
              

            国产精品久久久久久久久| 久久婷婷人人澡人人| 久久婷婷国产剧情内射白浆 | 欧美亚洲国产精品久久| 精品国产青草久久久久福利| 久久综合久久美利坚合众国| 久久99精品国产| 一本久久综合亚洲鲁鲁五月天| 久久99精品国产麻豆| 亚洲一区精品伊人久久伊人| 亚洲精品美女久久777777| 亚洲精品国精品久久99热一| 97精品国产91久久久久久| 合区精品久久久中文字幕一区 | 99热精品久久只有精品| 久久国产精品成人片免费| 中文字幕无码av激情不卡久久| 久久夜色精品国产噜噜亚洲AV| 久久婷婷人人澡人人爽人人爱| 伊人久久大香线蕉影院95| 18岁日韩内射颜射午夜久久成人| 一本久久精品一区二区| 久久国产视屏| 日韩美女18网站久久精品| 久久国产精品-国产精品| 一本色道久久88—综合亚洲精品| 麻豆av久久av盛宴av| 久久天天躁狠狠躁夜夜网站| 亚洲综合久久夜AV | 综合久久精品色| 精品久久久久久国产三级| 国产精品伊人久久伊人电影| av无码久久久久久不卡网站| 亚洲国产精品久久电影欧美| 国内精品人妻无码久久久影院导航| 久久亚洲欧洲国产综合| 久久伊人影视| 久久SE精品一区二区| 久久精品人妻中文系列| 亚洲狠狠婷婷综合久久蜜芽| 久久永久免费人妻精品下载|