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

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福利| 欧美激情第二页| 亚洲福利在线视频| 久久免费视频观看| 欧美大片免费看| 91久久国产综合久久91精品网站| 亚洲激情一区二区| 一区二区激情视频| 午夜精品999| 久久精品夜色噜噜亚洲a∨| 欧美成人免费在线| 国产精品久久毛片a| 国产亚洲毛片在线| 亚洲精品国产精品国自产观看| 洋洋av久久久久久久一区| 欧美一级片在线播放| 欧美阿v一级看视频| 99亚洲视频| 久久精品噜噜噜成人av农村| 欧美日韩国产欧| 精品91视频| 亚洲综合视频网| 欧美激情 亚洲a∨综合| 亚洲小说春色综合另类电影| 麻豆精品视频在线观看| 国产精品久久久久久久午夜| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲欧美国产日韩天堂区| 久久国产精品99精品国产| 欧美国产精品一区| 国产在线精品一区二区夜色| 在线视频一区观看| 久热精品视频在线| 亚洲影院一区| 欧美日韩免费在线观看| 亚洲高清在线观看一区| 久久精品理论片| 一本色道久久综合狠狠躁篇的优点 | 免费亚洲一区| 亚洲欧美久久久久一区二区三区| 欧美成人精品1314www| 国产日韩欧美在线| 亚洲欧美日韩精品久久奇米色影视| 欧美成人高清视频| 久久av一区二区三区| 国产精品嫩草99a| 一区二区三区 在线观看视| 欧美成人免费在线观看| 久久久国产精品亚洲一区| 国产欧美日本在线| 欧美一级视频精品观看| 美女诱惑一区| 亚洲午夜一区二区| 欧美日韩免费观看一区二区三区| 91久久久久久久久久久久久| 老司机精品导航| 欧美专区中文字幕| 国产亚洲一区二区三区| 欧美专区第一页| 亚洲专区在线| 国产日韩在线一区| 久久av最新网址| 久久成人精品无人区| 狠狠综合久久av一区二区老牛| 久久久久久久一区| 久久先锋影音| 亚洲啪啪91| 亚洲精品久久久久久久久| 欧美激情一区二区三区蜜桃视频 | 亚洲国产成人91精品| 欧美国产第二页| 欧美激情一区二区三区高清视频| 日韩亚洲一区二区| 9国产精品视频| 国产精品丝袜xxxxxxx| 久久久久在线观看| 欧美成人精品在线| 亚洲一区二区动漫| 欧美在线免费视频| 亚洲精品久久视频| 一本色道久久综合亚洲精品高清| 国产精品美女主播在线观看纯欲| 久久精品99国产精品| 免费精品99久久国产综合精品| 一本色道久久88精品综合| 国产精品99久久久久久久vr| 国产亚洲欧美日韩一区二区| 欧美xx69| 国产麻豆91精品| 亚洲第一搞黄网站| 国产目拍亚洲精品99久久精品| 狂野欧美激情性xxxx| 欧美日本韩国一区| 久久久天天操| 欧美日本一区| 狂野欧美性猛交xxxx巴西| 国产精品国产a级| 欧美成人按摩| 国产精品一区在线观看| 欧美激情在线免费观看| 国产精品视频一| 亚洲人成在线观看网站高清| 国产亚洲成精品久久| 亚洲国产成人精品久久久国产成人一区 | 亚洲色图在线视频| 在线日本高清免费不卡| 亚洲视频导航| 亚洲美女av黄| 欧美制服第一页| 麻豆精品视频在线观看| 欧美一区二区三区视频在线观看 | 美国十次了思思久久精品导航| 欧美大片在线看| 久久se精品一区二区| 欧美精品在线观看| 久久久免费观看视频| 欧美日韩免费区域视频在线观看| 久久婷婷丁香| 国产欧美丝祙| 亚洲另类春色国产| 亚洲国产日韩在线一区模特| 亚洲免费在线视频| 亚洲一区精品视频| 欧美激情视频一区二区三区在线播放| 欧美中文字幕视频在线观看| 欧美日韩一区三区| 亚洲美女视频在线观看| 亚洲精品日韩综合观看成人91| 午夜久久99| 亚洲永久免费观看| 欧美日本在线看| 亚洲日本va午夜在线电影| 精品96久久久久久中文字幕无| 亚洲欧美日韩成人| 性亚洲最疯狂xxxx高清| 国产精品嫩草99av在线| 亚洲一区影院| 香蕉视频成人在线观看| 国产精品私人影院| 亚洲欧美视频在线观看视频| 午夜日韩av| 国产精品自在欧美一区| 亚洲欧美日韩精品综合在线观看| 亚洲一二区在线| 国产精品v欧美精品v日韩| 一本色道久久88综合日韩精品| 9人人澡人人爽人人精品| 欧美人与性动交cc0o| 一区二区三区欧美在线| 亚洲欧美在线一区| 国产亚洲精品久久久久久| 久久精品国产第一区二区三区| 每日更新成人在线视频| 亚洲国产小视频在线观看| 欧美日本中文| 亚洲一区二区三区成人在线视频精品| 午夜精品久久99蜜桃的功能介绍| 国产精品一区二区久久久久| 欧美有码在线视频| 欧美成人蜜桃| 亚洲小说欧美另类社区| 国产农村妇女精品一二区| 欧美一区二区三区免费视| 欧美成人精品不卡视频在线观看| 日韩亚洲在线| 国产一区二区无遮挡| 久热精品视频在线观看| 亚洲精品一区二区网址| 欧美一区二区三区男人的天堂| 亚洲乱码国产乱码精品精| 亚洲欧美在线aaa| 黄色日韩在线| 欧美日韩亚洲视频一区| 欧美一区二区视频97| 欧美第十八页| 亚洲欧美日韩网| 亚洲韩国一区二区三区| 国产精品福利网站| 老巨人导航500精品| 一级日韩一区在线观看| 欧美+日本+国产+在线a∨观看| 一区二区三区四区蜜桃| 国产亚洲欧洲| 欧美色另类天堂2015| 美女黄毛**国产精品啪啪| 亚洲一区日韩| 亚洲另类春色国产| 亚洲国产高清高潮精品美女| 欧美在线观看一二区| 一区二区三区国产| 亚洲高清在线精品| 国产午夜精品麻豆| 欧美午夜美女看片| 欧美精品一区二区三区视频| 久久久一本精品99久久精品66| 亚洲一区二区视频在线观看| 亚洲片在线观看| 嫩模写真一区二区三区三州|