• <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>

            road420

            導航

            <2009年10月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            #pragma 預(yù)處理指令詳解

            #pragma 預(yù)處理指令詳解

            在所有的預(yù)處理指令中,#pragma 指令的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。

            依據(jù)定義,編譯指示是機器或操作系統(tǒng)專有的,且對于每個編譯器都是不同的。 
                其格式一般為: #pragma  para 
                其中para為參數(shù),下面來看一些常用的參數(shù)。 
             

            (1)message 信息參數(shù)

                #pragma  message("消息文本") 
                當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。 
            判斷自己有沒有在源代碼的什么地方定義了_X86這個宏,可以用下面的方法:
                #ifdef  _X86 
                #pragma  message("_X86  macro  activated!") 
                #endif  
                定義了_X86這個宏以后,應(yīng)用程序在編譯時就會在編譯輸出窗口里顯示"_86  macro  activated!"。  
                  

            (2)code_seg代碼段參數(shù)

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

            (3)#pragma once 

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

                  
            (4)#pragma  hdrstop

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

                  
            (5)#pragma  resource  "*.dfm"

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

                    
            (6)#pragma  warning( disable: 4507 34; once: 4385; error: 164 )
             
                等價于: 
                #pragma  warning( disable: 4507 34 )    //  不顯示4507和34號警告信息 
                #pragma  warning( once: 4385 )          //  4385號警告信息僅報告一次 
                #pragma  warning( error: 164 )          //  把164號警告信息作為一個錯誤。 

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


            (7)#pragma  comment(...) 

                該指令將一個注釋記錄放入一個對象文件或可執(zhí)行文件中。 
            常用的lib關(guān)鍵字,可以幫我們連入一個庫文件。如:
                #pragma  comment(lib, "comctl32.lib")
                #pragma  comment(lib, "vfw32.lib")
                #pragma  comment(lib, "wsock32.lib")
             
               
            每個編譯程序可以用#pragma指令激活或終止該編譯程序支持的一些編譯功能。

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

            有時,程序中會有些函數(shù)會使編譯器發(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ù)會產(chǎn)生一條有唯一特征碼100的警告信息,如此可暫時終止該警告。 

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


            補充 —— #pragma pack 與 內(nèi)存對齊問題


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

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

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

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


            如何使用c/c++中的對齊選項

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

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

                要專門針對某些結(jié)構(gòu)定義使用對齊選項,可以使用#pragma pack編譯指令:


            (1) #pragma  pack( [ n ] )

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


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

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

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

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


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

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

            posted on 2009-10-23 08:56 深邃者 閱讀(102) 評論(0)  編輯 收藏 引用

            久久九九有精品国产23百花影院| 亚洲午夜久久久影院| 久久精品国产清高在天天线| 亚洲伊人久久大香线蕉苏妲己| 亚洲国产成人久久综合区| 国产成人精品白浆久久69| 色妞色综合久久夜夜| 国内精品久久久久久久久 | 伊人久久综合无码成人网| 性做久久久久久久| 国产精品一区二区久久精品涩爱 | 奇米影视7777久久精品人人爽| 色诱久久久久综合网ywww | 亚洲综合精品香蕉久久网| 久久精品国产影库免费看| 久久偷看各类wc女厕嘘嘘| 久久久艹| 亚洲国产一成久久精品国产成人综合| 伊人久久无码中文字幕| 蜜桃麻豆www久久国产精品| 久久久久免费视频| 久久久国产精品福利免费| 午夜精品久久久久久久无码| 精品视频久久久久| 久久精品国产精品青草| 久久99热只有频精品8| 久久精品国产欧美日韩99热| 99久久香蕉国产线看观香| 国产精品久久久久久久午夜片| 久久精品免费大片国产大片| 国产亚洲精久久久久久无码| 亚洲午夜久久久久久噜噜噜| 亚洲日韩欧美一区久久久久我| 激情综合色综合久久综合| 色综合合久久天天综合绕视看| 97久久久久人妻精品专区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 色欲综合久久中文字幕网| 国产精品久久久久久久app | 99久久精品国产高清一区二区| 久久综合综合久久综合|