青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

yehao's Blog

#pragma用法詳解

目錄:
(0)   前言
(1) #pragma message能夠在編譯信息輸出窗口中輸出相應(yīng)的信息
(2) #pragma code_seg能夠設(shè)置程序中函數(shù)代碼存放的代碼段,開發(fā)驅(qū)動程序的時會用到
(3) #pragma  once若用在頭文件的最開始處就能夠保證頭文件被編譯一次
(4) #pragma  hdrstop表示預(yù)編譯頭文件到此為止
(5) #pragma  resource "*.dfm"表示把*.dfm文件中的資源加入工程
(6) #pragma warning允許有選擇性的修改編譯器的警告消息的行為
(7) #pragma comment將一個注釋記錄放入一個對象文件或可執(zhí)行文件中
(8) #pragma data_seg建立一個新的數(shù)據(jù)段并定義共享數(shù)據(jù)
                                                    應(yīng)用1:在DLL中定義一個共享的,有名字的數(shù)據(jù)段
                                                    應(yīng)用2: data_seg控制應(yīng)用程序的啟動次數(shù)
(9) 其他用法


   

 

(0)前言

  #Pragma 指令的作用是設(shè)定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。#pragma 指令對每個編譯器給出了一個方法,在保持與C和C++語言完全兼容的情況下,給出主機或操作系統(tǒng)專有的特征。依據(jù)定義,編譯指示是機器或操作系統(tǒng)專有的,且對于每個編譯器都是不同的。  
   其格式一般為:   #Pragma   Para  
  其中Para為參數(shù),下面來看一些常用的參數(shù)。  


(1) #Pragma message參數(shù)能夠在編譯信息輸出窗口中輸出相應(yīng)的信息

       這對于源代碼信息的控制是非常重要的。其使用方法為: Pragma   message(“消息文本”)   
       當(dāng)我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設(shè)置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設(shè)我們希望判斷自己有沒有在源代碼的什么地方定義了_X86這個宏可以用下面的方法  
            #ifdef   _X86  
            #pragma message(“_X86 macro activated!”)  
            #endif  
       若定義了_X86,程序編譯時就會在顯示“_X86 macro activated!”。我們就不會因為不記得自己定義的一些特定的宏而抓耳撓腮了 。  

(2) #pragma code_seg能夠設(shè)置程序中函數(shù)代碼存放的代碼段,

     開發(fā)驅(qū)動程序的時候就會使用到它。格式如下:  
         #pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ][ "segment-name" [, "segment-class" ] ])
     該指令用來指定函數(shù)在.obj文件中存放的節(jié),觀察OBJ文件可以使用VC自帶的dumpbin命令行程序 ,如果code_seg沒有帶參數(shù)的話,則函數(shù)在OBJ文件中存放在默認在.text節(jié)中。
    push (可選參數(shù)) 將一個記錄放到內(nèi)部編譯器的堆棧中,可選參數(shù)可以為一個標(biāo)識符或者節(jié)名
    pop(可選參數(shù)) 將一個記錄從堆棧頂端彈出,該記錄可以為一個標(biāo)識符或者節(jié)名
    identifier (可選參數(shù)) 當(dāng)使用push指令時,為壓入堆棧的記錄指派的一個標(biāo)識符,當(dāng)該標(biāo)識符被刪除的時候和其相關(guān)的堆棧中的記錄將被彈出堆棧
    "segment-name" (可選參數(shù)) 表示函數(shù)存放的節(jié)名
例如:
            //默認情況下,函數(shù)被存放在.text節(jié)中
            void func1() {                  // stored in .text
                              }
            //將函數(shù)存放在.my_data1節(jié)中
            #pragma code_seg(".my_data1")
            void func2() {                  // stored in my_data1
                              }
            //r1為標(biāo)識符,將函數(shù)放入.my_data2節(jié)中
             #pragma code_seg(push, r1, ".my_data2")
             void func3() {                  // stored in my_data2
                               }
              int main() {}


 (3)#pragma  once (比較常用)若用在頭文件的最開始處就能夠保證頭文件被編譯一次.

      一般在整個工程中我們只要包含頭文件一次就夠了,若多個.c/.cpp 文件中都要包含同一個頭文件,比如 Windows.h,那很多聲明等等豈不是有兩次了?解決這個問題的傳統(tǒng)的方法是在頭文件開始出用 #define 定義一個宏,比如 Windows.h 中:  
              #ifndef   _WINDOWS_  
              #define   _WINDOWS_  
              #endif
      這樣就可以避免被包含多次。但是這樣的后果是代碼的可讀性較差 (個人觀點),VC給我們提供了另外一個途徑,那就是在文件的前面加上:  
               #pragma   once”  


   
(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允許有選擇性的修改編譯器的警告消息的行為

指令格式如下:
                #pragma warning( warning-specifier : warning-number-list [;warning-specifier :  warning-  number-list...])
                #pragma warning( push[ ,n ] )
                #pragma warning( pop )
主要用到的警告表示有如下幾個:
                once:只顯示一次(警告/錯誤等)消息
                default:重置編譯器的警告行為到默認狀態(tài)
                1,2,3,4:四個警告級別
                disable:禁止指定的警告信息
                error:將指定的警告信息作為錯誤報告
                 #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( 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í)行文件中

該指令的格式為

 #pragma comment( "comment-type" [, commentstring] )
                 comment-type(注釋類型):可以指定為五種預(yù)定義的標(biāo)識符的其中一種,五種預(yù)定義的標(biāo)識符為:
           compiler:將編譯器的版本號和名稱放入目標(biāo)文件中,本條注釋記錄將被編譯器忽略,如果你為該記錄類型提供了commentstring參數(shù),編譯器將會產(chǎn)生一個警告
           例如:#pragma comment( compiler )
           exestr: 鏈接時,將commentstring參數(shù)放入到可執(zhí)行文件中,當(dāng)操作系統(tǒng)加載可執(zhí)行文件的時候,該參數(shù)字符串不會被加載到內(nèi)存中.但是,該字符串可被dumpbin之類的程序查找出并打印出來,你可以用這個標(biāo)識符將版本號碼之類的信息嵌入到可執(zhí)行文件中!
            lib:用來將一個庫文件鏈接到目標(biāo)文件中
比如我們連接的時候用到了WSock32.lib,你當(dāng)然可以不辭辛苦地把它加入到你的工程中。但是我覺得更方便的方法是使用#pragma指示符,指定要連接的庫:  
                                    #pragma   comment(lib,   "WSock32.lib")
              linker:將一個鏈接選項放入目標(biāo)文件中,你可以使用這個指令來代替由命令行傳入的或者在開發(fā)環(huán)境中設(shè)置的鏈接選項,你可以指定/include選項來強制包含某個對象,例如:
                                     #pragma comment(linker, "/include:__mySymbol")
你可以在程序中設(shè)置下列鏈接選項
                                    /DEFAULTLIB
                                    /EXPORT
                                    /INCLUDE
                                    /MERGE
                                    / SECTION
   這些選項在這里就不一一說明了,詳細信息請看msdn!
             user:將一般的注釋信息放入目標(biāo)文件中commentstring參數(shù)包含注釋的文本信息,這個注釋記錄將被鏈接器忽略,例如:
                                   #pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )


 
(8)#pragma data_seg建立一個新的數(shù)據(jù)段并定義共享數(shù)據(jù)

格式為:
             #pragma data_seg ("shareddata")
             HWND sharedwnd=NULL;//共享數(shù)據(jù)
              #pragma data_seg()

應(yīng)用1:在DLL中定義一個共享的,有名字的數(shù)據(jù)段。
       注意:a、這個數(shù)據(jù)段中的全局變量能夠被多個進程共享。否則多個進程之間無法共享DLL中的全局變量。
       b、共享數(shù)據(jù)必須初始化,否則微軟編譯器會把沒有初始化的數(shù)據(jù)放到.BSS段中,從而導(dǎo)致多個進程之間的共享行為失敗。
     假如在一個DLL中這么寫:
                 #pragma data_seg("MyData")
                 int g_Value; // 全局變量未初始化
                 #pragma data_seg()
      DLL提供兩個接口函數(shù):
                 int GetValue()
                         {
                          return g_Value;
                          }
                  void SetValue(int n)
                          {
                          g_Value = n;
                          }
          然后啟動兩個都調(diào)用了這個DLL的進程A和B,假如A調(diào)用了SetValue(5); B接著調(diào)用int m = GetValue(); 那么m的值不一定是5,而是個未定義的值。因為DLL中的全局數(shù)據(jù)對于每一個調(diào)用他的進程而言,是私有的,不能共享的。假如您對g_Value進行了初始化,那么g_Value就一定會被放進MyData段中。

換句話說,假如A調(diào)用了SetValue(5); B接著調(diào)用int m = GetValue(); 那么m的值就一定是5!這就實現(xiàn)了跨進程之間的數(shù)據(jù)通信!#pragma

應(yīng)用2: data_seg控制應(yīng)用程序的啟動次數(shù)
        有的時候我們可能想讓一個應(yīng)用程序只啟動一次,就像單件模式(singleton)一樣,實現(xiàn)的方法可能有多種,這里說說用#pragma data_seg來實現(xiàn)的方法,很是簡潔便利。應(yīng)用程序的入口文件前面加上:
              #pragma data_seg("flag_data")
              int app_count = 0;
               #pragma data_seg()
              #pragma comment(linker,"/SECTION:flag_data,RWS")
    然后程序啟動的地方加上
               if(app_count>0)    // 如果計數(shù)大于0,則退出應(yīng)用程序。
                             {
                             //MessageBox(NULL, "已經(jīng)啟動一個應(yīng)用程序", "Warning", MB_OK);
                             //printf("no%d application", app_count);
                             return FALSE;
                              }
               app_count++;


(9)其他用法

    編譯程序可以用#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)不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。

 

本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/gueter/archive/2008/03/31/2234072.aspx

posted on 2011-05-01 19:12 厚積薄發(fā) 閱讀(384) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

導(dǎo)航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久中文字幕导航| 欧美一区二区三区四区高清| 久久人人看视频| 亚洲盗摄视频| 亚洲一区二区三区在线播放| 欧美一级久久久久久久大片| 性欧美大战久久久久久久免费观看| 免费永久网站黄欧美| 国产亚洲欧美日韩在线一区| 亚洲图片欧洲图片日韩av| 亚洲欧洲在线免费| 六月丁香综合| 亚洲人成7777| 国产精品一区在线观看| 一区二区三区四区五区精品| 亚洲国产精品一区二区www在线 | 夜久久久久久| 国产精品专区一| 欧美在线一级va免费观看| 亚洲特级毛片| 狠狠色丁香婷婷综合久久片| 免费久久精品视频| 欧美激情一区二区在线 | 麻豆精品视频在线观看视频| 一本色道久久综合亚洲精品不卡 | 欧美日韩亚洲视频| 亚洲免费在线| 欧美一区不卡| 一本色道久久88综合亚洲精品ⅰ| 亚洲国产精品精华液网站| 亚洲人成网站在线播| 欧美午夜精品久久久久久孕妇| 欧美一区二区高清| 美女在线一区二区| 欧美淫片网站| 国产精品五月天| 欧美激情bt| 狠狠色香婷婷久久亚洲精品| 一区二区欧美视频| 久久精品视频免费观看| 亚洲午夜一区| 欧美a级片网站| 麻豆91精品91久久久的内涵| 国产精品夜夜夜| 一本久久综合亚洲鲁鲁| 亚洲国产精品成人综合| 久久成人精品视频| 午夜精品一区二区在线观看 | 一区二区三区日韩| 亚洲精品美女在线| 裸体歌舞表演一区二区| 男人插女人欧美| 国产偷国产偷精品高清尤物| 亚洲在线黄色| 欧美日韩国产va另类| 亚洲第一黄网| 一区二区电影免费观看| 欧美日韩亚洲91| 亚洲一区不卡| 裸体女人亚洲精品一区| 欧美自拍偷拍| 国产亚洲毛片| 午夜久久久久| 久久免费视频观看| 亚洲精品美女免费| 欧美午夜精品理论片a级按摩| 亚洲理论在线观看| 性欧美8khd高清极品| 激情丁香综合| 国产精品豆花视频| 一本久道久久综合狠狠爱| 欧美丰满高潮xxxx喷水动漫| 亚洲伊人色欲综合网| 欧美大片免费观看在线观看网站推荐| 99精品国产热久久91蜜凸| 国产精品视频一二| 六十路精品视频| 性久久久久久久久久久久| 亚洲欧洲日本国产| 欧美xx69| 久久影院午夜片一区| 午夜亚洲性色视频| 精品成人在线视频| 国产美女精品视频免费观看| 欧美日韩国语| 欧美日韩亚洲一区二区三区四区| 久久久91精品国产| 久久久久国产精品www| 一区二区三区成人精品| 日韩亚洲欧美一区| 亚洲激情在线观看视频免费| 免费不卡在线视频| 久久精品官网| 免费看av成人| 亚洲精品乱码久久久久久黑人 | 好看的日韩av电影| 欧美一区二区三区另类| 欧美一区二区三区播放老司机| 亚洲一二三区在线观看| 亚洲欧美国产另类| 久久精品盗摄| 欧美成人蜜桃| 欧美视频四区| 国产精品最新自拍| 欧美成va人片在线观看| 久久天堂成人| 欧美日本亚洲韩国国产| 欧美一区二区高清在线观看| 亚洲欧美激情四射在线日| 午夜精品久久久久久99热软件| 亚洲无亚洲人成网站77777| 久久精品中文字幕一区二区三区| 一本色道久久综合亚洲精品婷婷| 在线视频你懂得一区二区三区| 一区二区三区av| 一区二区三区四区五区视频| 日韩网站在线看片你懂的| 一区二区高清视频| 久久国产精品72免费观看| 亚洲深夜福利网站| 久久国产精品久久久久久| 欧美一区二区三区在线观看视频| 久久精品成人| 一本色道久久88综合亚洲精品ⅰ| 欧美一级专区| 午夜欧美不卡精品aaaaa| 99视频有精品| 正在播放欧美视频| 亚洲一区www| 欧美精品一区二| 国产一区二三区| 一区二区日韩| 亚洲国产另类久久精品| 久久精品国产久精国产爱| 国产精品成人免费视频| 91久久综合| 久久激情五月丁香伊人| 一本久久a久久精品亚洲| 久久久久天天天天| 一区二区三区 在线观看视| 久久婷婷影院| 亚洲国产91色在线| 亚洲美女啪啪| 91久久久一线二线三线品牌| 欧美资源在线观看| 国产精品视频九色porn| 亚洲国产人成综合网站| 米奇777在线欧美播放| 午夜免费在线观看精品视频| 国产一区二区三区在线观看精品| 久久国产精品第一页| 欧美一区二区三区日韩| 国产欧美在线| 免费日韩av| 欧美国产先锋| 国产精品视频第一区| 亚洲欧美在线观看| 欧美不卡视频一区| 欧美黄污视频| 亚洲一区久久| 性8sex亚洲区入口| 国产欧美欧美| 亚洲精品国产精品乱码不99| 欧美私人啪啪vps| 欧美v日韩v国产v| 国产精品你懂得| 亚洲欧洲另类| 在线不卡中文字幕播放| 99视频超级精品| 亚洲一区二区三区四区五区午夜| 久久精品国产亚洲精品| 亚洲视频在线一区| 久久蜜桃精品| 性色一区二区| 欧美日韩综合视频| 久久久午夜视频| 国产精品久久久久久久久久久久| 亚洲黄色视屏| 欧美日韩国产页| 亚洲国产欧美一区二区三区同亚洲 | 亚洲二区免费| 久久久成人网| 欧美日韩中字| 亚洲福利小视频| 亚洲黄色av| 巨乳诱惑日韩免费av| 久久精品国产一区二区电影 | 久久久青草婷婷精品综合日韩| 亚洲美女精品成人在线视频| 欧美一区二区三区在线视频| 欧美在线视频一区二区| 国产精品老牛| 欧美一区二区三区精品电影| 国产精品视频免费| 中文日韩在线视频| 久久av二区| 国产精品免费区二区三区观看| 亚洲在线播放| 久久中文字幕导航| 一区二区日韩|