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

yehao's Blog

#pragma用法詳解

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


   

 

(0)前言

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


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

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

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

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


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

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


   
(4)#pragma  hdrstop表示預編譯頭文件到此為止

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


 
(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:重置編譯器的警告行為到默認狀態
                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 )保存所有警告信息的現有的警告狀態。  
                 #pragma   warning( push,n)保存所有警告信息的現有的警告狀態,并且把全局警告等級設定為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將一個注釋記錄放入一個對象文件或可執行文件中

該指令的格式為

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


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

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

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

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

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


(9)其他用法

    編譯程序可以用#pragma指令激活或終止該編譯程序支持的一些編譯功能。例如,對循環優化功能:
                 #pragma loop_opt(on)         // 激活
                 #pragma loop_opt(off)       // 終止
      有時,程序中會有些函數會使編譯器發出你熟知而想忽略的警告,如   “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
      函數會產生一條有唯一特征碼100的警告信息,如此可暫時終止該警告。 每個編譯器對#pragma的實現不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/gueter/archive/2008/03/31/2234072.aspx

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

導航

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

統計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久综合网站| 亚洲大黄网站| 亚洲一级二级在线| 国产精品xvideos88| 亚洲视频在线免费观看| 亚洲午夜羞羞片| 国产精品一区二区你懂得| 香蕉久久国产| 久久国产黑丝| 亚洲美女黄色| 亚洲一区二区三区午夜| 国产亚洲欧洲997久久综合| 久久综合色婷婷| 欧美99在线视频观看| 在线一区免费观看| 午夜亚洲性色视频| 亚洲国产激情| 在线亚洲高清视频| 黄色影院成人| 99热精品在线| 国产一区二区中文字幕免费看| 久久综合国产精品| 欧美—级高清免费播放| 亚洲欧美影音先锋| 久久一日本道色综合久久| 夜夜爽www精品| 久久精品人人爽| 亚洲一级特黄| 久久久久久免费| 亚洲欧美日韩另类| 美女精品在线观看| 欧美一级一区| 欧美人与性动交cc0o| 久久久久网址| 国产精品成人一区二区网站软件| 久久免费国产| 欧美亚一区二区| 欧美激情五月| 精久久久久久| 亚洲欧美日韩国产精品| 亚洲精品在线免费观看视频| 午夜精品一区二区三区在线视| 亚洲精选久久| 久久精品在线播放| 羞羞色国产精品| 欧美人与禽猛交乱配视频| 另类综合日韩欧美亚洲| 国产精品一区二区三区观看| 亚洲精品久久嫩草网站秘色| 黄色一区二区三区| 亚洲免费中文| 午夜精品福利一区二区蜜股av| 欧美电影免费观看网站| 免费看av成人| 国内精品模特av私拍在线观看| 中国日韩欧美久久久久久久久| 日韩视频免费| 欧美国产视频在线观看| 欧美二区在线| 在线精品亚洲| 久久久一二三| 开元免费观看欧美电视剧网站| 国产欧美在线看| 亚洲欧美久久| 久久精品国产在热久久| 国产欧美一区二区三区久久| 亚洲一区二区网站| 欧美一级日韩一级| 国产麻豆91精品| 香蕉乱码成人久久天堂爱免费 | 欧美日韩精品久久| 亚洲国产精品传媒在线观看| 亚洲国产精品视频| 蜜桃久久av一区| 亚洲激情图片小说视频| 日韩视频在线观看免费| 欧美大片免费久久精品三p| 亚洲国产一区二区视频| 亚洲免费电影在线| 欧美视频在线观看| 亚洲欧美www| 久久亚洲午夜电影| 亚洲黄色性网站| 欧美片第一页| 午夜影院日韩| 欧美成人官网二区| 夜夜躁日日躁狠狠久久88av| 国产精品久久久久毛片软件| 午夜精品视频网站| 免费在线看成人av| 99在线精品免费视频九九视| 国产精品免费小视频| 久久9热精品视频| 亚洲国产精品成人综合色在线婷婷| 一区二区三区视频在线播放| 国产精品美女久久久久aⅴ国产馆| 午夜精品成人在线| 欧美激情一区二区久久久| 亚洲一区二区黄| 永久免费精品影视网站| 欧美日韩国产不卡| 亚洲综合999| 亚洲国产美女精品久久久久∴| 在线一区日本视频| 黑丝一区二区| 国产精品成人观看视频免费| 久久久久久综合网天天| 99日韩精品| 欧美成人精品在线| 先锋a资源在线看亚洲| 亚洲激情在线播放| 国产伦理一区| 欧美三区在线视频| 久久综合五月| 欧美亚洲一区在线| 夜色激情一区二区| 亚洲电影一级黄| 久久亚洲美女| 午夜久久99| 亚洲视频电影在线| 亚洲国产一区二区在线| 国产亚洲欧洲一区高清在线观看| 欧美精品在线一区二区三区| 久久深夜福利| 久久精品国产亚洲5555| 亚洲一级特黄| 99re这里只有精品6| 欧美高清视频在线观看| 久久久久久网| 性欧美精品高清| 亚洲欧美日韩成人高清在线一区| 亚洲日韩视频| 亚洲国产婷婷综合在线精品| 激情综合五月天| 狠狠色综合一区二区| 国产亚洲精品久| 国产精品自在线| 国产精品日韩专区| 国产精品美女久久福利网站| 国产精品成人午夜| 国产精品久久久999| 欧美四级在线| 国产精品美女| 国产欧美一区二区色老头 | 美女主播一区| 免费观看久久久4p| 裸体素人女欧美日韩| 久久久另类综合| 久久综合色一综合色88| 免费日韩成人| 欧美日韩精品免费观看视一区二区| 欧美国产精品一区| 欧美日韩国产综合视频在线观看中文 | 亚洲欧美日韩国产综合在线| 亚洲一区二区免费看| 亚洲图片欧洲图片av| 亚洲免费影视第一页| 欧美一级专区| 久久久综合激的五月天| 欧美ed2k| 亚洲伦理一区| 亚洲一区二区三区三| 欧美在线亚洲在线| 美女脱光内衣内裤视频久久网站| 美女精品视频一区| 欧美日韩视频在线一区二区观看视频| 欧美视频1区| 国产有码一区二区| 亚洲国产日韩一区| 亚洲天堂久久| 久久亚洲国产精品日日av夜夜| 麻豆91精品| 99re热精品| 久久成人综合视频| 欧美激情91| 国产亚洲精品久久久| 亚洲剧情一区二区| 久久精品1区| 亚洲欧洲三级| 欧美一区二区三区四区在线| 免费一区视频| 国产精一区二区三区| 亚洲经典在线看| 欧美一区二区三区成人| 欧美黄色精品| 欧美一级一区| 欧美日韩免费高清一区色橹橹| 国产午夜精品麻豆| 一区二区三区**美女毛片 | 亚洲国产精品99久久久久久久久| 一区二区三区成人精品| 久久色在线观看| 亚洲一区二区三区777| 免费观看在线综合| 国产亚洲欧美日韩精品| 日韩午夜中文字幕| 牛牛影视久久网| 亚洲欧美三级在线| 欧美日韩在线免费| 亚洲精品久久在线|