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

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>
            欧美日韩国产美| 国产午夜精品全部视频在线播放| 亚洲第一在线| 免费久久99精品国产自| 裸体女人亚洲精品一区| 亚洲黄色视屏| 一本大道久久精品懂色aⅴ| 欧美日韩一区二区在线视频| 亚洲欧美日韩视频一区| 午夜精品久久久久久99热| 国内综合精品午夜久久资源| 久久视频免费观看| 欧美黄色视屏| 欧美亚洲在线| 蜜桃av一区二区三区| 亚洲午夜精品久久| 午夜天堂精品久久久久| 91久久极品少妇xxxxⅹ软件| 日韩视频在线免费观看| 国产一区二区三区四区老人| 欧美激情按摩| 国产欧美日韩伦理| 亚洲国产精品一区二区久| 国产精品入口夜色视频大尺度| 久久精品亚洲精品| 欧美巨乳波霸| 久久久久久亚洲精品杨幂换脸| 欧美高清视频一区二区三区在线观看| 亚洲男女自偷自拍图片另类| 久久人体大胆视频| 欧美一区二区三区日韩| 欧美激情女人20p| 久久久999精品| 欧美日韩一区二区三区| 欧美成人一区二区在线| 国产精品久久久对白| 欧美国产日本| 国产亚洲激情| 亚洲一区二区欧美| 亚洲精选在线观看| 久久青草久久| 久久精品国产综合| 欧美日韩精品综合在线| 女生裸体视频一区二区三区| 国产区日韩欧美| 一本色道久久综合| 亚洲精品一区二区三区在线观看 | 久热精品视频| 国产精品免费久久久久久| 亚洲激情影院| 亚洲第一视频网站| 欧美主播一区二区三区| 欧美一级成年大片在线观看| 欧美日韩亚洲精品内裤| 亚洲国产婷婷| 亚洲国产精品久久久久婷婷老年| 久久99伊人| 久久久综合精品| 国产色产综合产在线视频| 亚洲视频精选| 亚洲欧美日韩精品一区二区 | 欧美一区二区三区四区在线观看| 亚洲永久免费观看| 国产精品xxxxx| 一本色道**综合亚洲精品蜜桃冫| 中国成人黄色视屏| 欧美日韩在线亚洲一区蜜芽| 亚洲精品护士| 宅男噜噜噜66一区二区66| 欧美日韩一区二区三区在线视频 | 午夜久久黄色| 久久国产加勒比精品无码| 国产视频丨精品|在线观看| 欧美一区二区三区久久精品茉莉花 | 久久精品视频网| 久久全球大尺度高清视频| 精品成人一区二区三区| 久久久久久久久久久久久9999| 久久久久国色av免费观看性色| 国内精品久久久久影院 日本资源| 久久成人精品| 亚洲电影免费观看高清| 中日韩视频在线观看| 国产精品www| 久久se精品一区二区| 蜜桃久久精品乱码一区二区| 亚洲区中文字幕| 国产精品成人免费| 欧美诱惑福利视频| 亚洲第一精品在线| 亚洲欧美一区二区三区久久| 国产一区高清视频| 免费亚洲电影在线观看| 妖精视频成人观看www| 欧美在线一二三四区| 亚洲黄色在线观看| 国产精品久久久久影院色老大| 欧美一区二区日韩一区二区| 亚洲第一区在线观看| 亚洲欧美色婷婷| 在线看欧美日韩| 欧美视频在线观看视频极品| 欧美在线免费一级片| 亚洲日本在线观看| 久久久久久久性| 国产精品99久久久久久www| 韩日欧美一区| 国产精品二区影院| 噜噜噜噜噜久久久久久91| 亚洲影院色无极综合| 欧美激情视频一区二区三区在线播放| 亚洲视频电影图片偷拍一区| 红桃视频成人| 国产精品网曝门| 欧美精品三级在线观看| 久久黄色网页| 亚洲一二三区在线观看| 亚洲精品123区| 免费观看不卡av| 欧美中文字幕第一页| 亚洲午夜免费福利视频| 亚洲黄色免费网站| 在线成人www免费观看视频| 国产精品色婷婷| 欧美日一区二区三区在线观看国产免| 久久九九久精品国产免费直播| 亚洲欧美www| 亚洲私人影院| 日韩视频―中文字幕| 亚洲成色www8888| 女女同性精品视频| 久久夜色精品一区| 久久久精品一区| 久久xxxx精品视频| 羞羞答答国产精品www一本| 亚洲天堂第二页| 亚洲私拍自拍| 亚洲小说欧美另类社区| 亚洲午夜视频在线| 在线综合欧美| 亚洲无线视频| 亚洲欧美韩国| 午夜宅男欧美| 欧美在线短视频| 久久精品最新地址| 久久免费视频在线| 免费亚洲网站| 欧美激情1区2区3区| 亚洲国产黄色片| 亚洲精品一区在线观看香蕉| 亚洲精品免费一区二区三区| 亚洲精品四区| 亚洲一区二区成人| 午夜一区二区三视频在线观看| 欧美一区二区视频观看视频| 久久精品首页| 欧美高清视频一区二区| 欧美日韩视频一区二区| 国产精品日韩精品欧美在线 | 欧美二区在线播放| 欧美日韩免费观看中文| 国产精品成人一区二区| 国产日韩欧美在线观看| 在线免费一区三区| 日韩视频免费大全中文字幕| 国产精品99久久久久久人| 欧美一区二区三区日韩| 免费成人美女女| 亚洲国产99| 亚洲午夜精品在线| 久久嫩草精品久久久精品| 欧美www视频在线观看| 欧美日韩在线精品一区二区三区| 国产欧美日韩一区二区三区在线观看 | 国产一区在线免费观看| 亚洲国产高潮在线观看| 亚洲午夜在线| 免费日韩av片| 中国成人亚色综合网站| 久久婷婷综合激情| 欧美性大战久久久久| 在线不卡中文字幕| 亚洲一区黄色| 欧美成在线视频| 亚洲在线视频观看| 欧美大片免费久久精品三p| 国产麻豆精品在线观看| 亚洲三级视频| 久久伊伊香蕉| 亚洲一区在线观看视频| 免费中文日韩| 国内精品国语自产拍在线观看| 一区二区三区国产精华| 乱中年女人伦av一区二区| 亚洲一区二区在线视频 | 欧美一区二区国产| 欧美日韩视频在线一区二区观看视频 | 亚洲区一区二区三区| 久久精品视频亚洲| 亚洲一区二区三区中文字幕在线|