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

            導(dǎo)航

            <2008年10月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            統(tǒng)計(jì)

            常用鏈接

            留言簿(2)

            隨筆檔案

            文章檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            #Pragma 指令介紹

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

            其格式一般為: #Pragma Para
            其中Para 為參數(shù),下面來看一些常用的參數(shù)。

            (1)message 參數(shù)。

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

            (2)另一個(gè)使用得比較多的pragma參數(shù)是code_seg。

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

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

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

            (4)#pragma hdrstop

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

            (5)#pragma resource

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

            (6)#pragma warning

            #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è)對象文件或可執(zhí)行文件中。
            常用的lib關(guān)鍵字,可以幫我們連入一個(gè)庫文件。

            (8)progma data_seg

            有的時(shí)候我們可能想讓一個(gè)應(yīng)用程序只啟動(dòng)一次,就像單件模式(singleton)一樣,實(shí)現(xiàn)的方法可能有多種,這里說說用#pragma data_seg來實(shí)現(xiàn)的方法,很是簡潔便利。

            應(yīng)用程序的入口文件前面加上

            #pragma data_seg("flag_data")
            int app_count = 0;
            #pragma data_seg()
            #pragma comment(linker,"/SECTION:flag_data,RWS")

            然后程序啟動(dòng)的地方加上

            if(app_count>0)     // 如果計(jì)數(shù)大于0,則退出應(yīng)用程序。
            {
               //MessageBox(NULL, "已經(jīng)啟動(dòng)一個(gè)應(yīng)用程序", "Warning", MB_OK);

               //printf("no%d application", app_count);

               return FALSE;
            }
            app_count++;

            Windows 在一個(gè)Win32程序的地址空間周圍筑了一道墻。通常,一個(gè)程序的地址空間中的數(shù)據(jù)是私有的,對別的程序而言是不可見的。但是執(zhí)行STRPROG的多個(gè)執(zhí)行實(shí)體表示了STRLIB在程序的所有執(zhí)行實(shí)體之間共享數(shù)據(jù)是毫無問題的。當(dāng)您在一個(gè)STRPROG窗口中增加或者刪除一個(gè)字符串時(shí),這種改變將立即反映在其它的窗口中。

            在全部例程之間,STRLIB共享兩個(gè)變量:一個(gè)字符數(shù)組和一個(gè)整數(shù)(記錄已儲(chǔ)存的有效字符串的個(gè)數(shù))。STRLIB將這兩個(gè)變量儲(chǔ)存在共享的一個(gè)特殊內(nèi)存區(qū)段中:

            #pragma      data_seg ("shared")
                    
            int                 iTotal = 0 ;
                    
            WCHAR               szStrings [MAX_STRINGS][MAX_LENGTH + 1] = { '\0' } ;
                    
            #pragma      data_seg ()
                    

            第一個(gè)#pragma敘述建立數(shù)據(jù)段,這里命名為shared。您可以將這段命名為任何一個(gè)您喜歡的名字。在這里的#pragma敘述之后的所有初始化了的變量都放在shared數(shù)據(jù)段中。第二個(gè)#pragma敘述標(biāo)示段的結(jié)束。對變量進(jìn)行專門的初始化是很重要的,否則編譯器將把它們放在普通的未初始化數(shù)據(jù)段中而不是放在shared中。

            連結(jié)器必須知道有一個(gè)「shared」共享數(shù)據(jù)段。在「Project Settings」對話框選擇「Link」頁面卷標(biāo)。選中「STRLIB」時(shí)在「Project Options」字段(在Release和Debug設(shè)定中均可),包含下面的連結(jié)敘述:

            /SECTION:shared,RWS
                    

            字母RWS表示段具有讀、寫和共享屬性。或者,您也可以直接用DLL原始碼指定連結(jié)選項(xiàng),就像我們在STRLIB.C那樣:

            #pragma comment(linker,"/SECTION:shared,RWS")
                    

            共享的內(nèi)存段允許iTotal變量和szStrings字符串?dāng)?shù)組在STRLIB的所有例程之間共享。因?yàn)镸AX_STRINGS等于256,而 MAX_LENGTH等于63,所以,共享內(nèi)存段的長度為32,772字節(jié)-iTotal變量需要4字節(jié),256個(gè)指針中的每一個(gè)都需要128字節(jié)。

            posted on 2010-09-16 10:25 深邃者 閱讀(235) 評(píng)論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久午夜羞羞影院免费观看| 久久99国产综合精品| 久久久久亚洲AV成人片| 久久精品国产秦先生| 狠狠色丁香婷婷综合久久来来去| 欧美精品一区二区精品久久| 色婷婷狠狠久久综合五月| 无遮挡粉嫩小泬久久久久久久| 一本一道久久精品综合| 无码人妻久久久一区二区三区| 久久国产精品无码一区二区三区 | 亚洲国产精品一区二区三区久久| 97久久婷婷五月综合色d啪蜜芽| 一本一本久久a久久综合精品蜜桃| 日产精品久久久一区二区| 99久久综合狠狠综合久久| 久久亚洲欧美国产精品| 91精品国产高清久久久久久91| 久久久国产99久久国产一| 伊人久久综在合线亚洲2019| 久久天天躁夜夜躁狠狠| 亚洲国产成人久久综合碰| 久久亚洲综合色一区二区三区| 亚洲精品无码专区久久久| 久久男人AV资源网站| 老司机国内精品久久久久| 超级碰碰碰碰97久久久久| 伊人久久一区二区三区无码| 日韩精品国产自在久久现线拍| 久久精品国产亚洲AV无码娇色 | 久久精品国产影库免费看| 国产香蕉久久精品综合网| 久久亚洲精品成人无码网站| 狠狠久久综合伊人不卡| 91精品国产91久久| 久久精品一区二区国产| 国产精品久久久久久福利漫画 | 色狠狠久久综合网| 欧美成a人片免费看久久| 人妻少妇精品久久| 性高朝久久久久久久久久|