有關VC編譯器的#pragma的用法

在所有的預處理指令中,#Pragma   指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與CC ++語言完全兼容的情況下,給出主機或操作系統專有的特徵。依據定義,編譯指示是機器或操作系統專有的,且對於每個編譯器都是不同的。  
其格式一般爲
:         #Pragma   Para  
       
其中Para   爲參數,下面來看一些常用的參數。
  

       (1)message  
參數。  
        Message  
參數是我最喜歡的一個參數,它能夠在編譯信息輸出窗口中輸出相應的信息,這對於源代碼信息的控制是非常重要的。其使用方法爲:
  
              #Pragma   message(“
消息文本
”)  
             
當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來。
  
       
當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。假設我們希望判斷自己有沒有在源代碼的什麼地方定義了_X86這個宏可以用下面的方法
  
              #ifdef   _X86  
              #Pragma   message(“_X86   macro   activated!”)  
              #endif  
             
當我們定義了_X86這個宏以後,應用程序在編譯時就會在編譯輸出窗口裏顯示
“_  
X86   macro   activated!”
。我們就不會因爲不記得自己定義的一些特定的宏而抓耳撓腮了。
  
       
     
(2)
另一個使用得比多的pragma參數是code_seg
          
格式如:  
            #pragma   code_seg(   ["section-name"[,"section-class"]   ]   )  
           
它能夠設置程序中函數代碼存放的代碼段,當我們開發驅動程序的時候就會使用到它。
  

     (3)#pragma   once   (
常用)  
           
只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經有了,但是考慮到兼容性並沒有太多的使用它。  
       
     
(4)#pragma   hdrstop
表示預編譯頭文件到此止,後面的文件不預編譯
       
BCB可以預編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預編譯又可能佔太多磁盤空間,所以使用這個選項排除一些頭文件。    
         
有時單元之間有依賴關係,比如單元A依賴單元B,所以單元B要先於單元A編譯。你可以用#pragma   startup指定編譯優先級,如果使用了#pragma   package(smart_init)   BCB就會根據優先級的大小先後編譯。
    
       
     (5)#pragma   resource "*.dfm"
表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體
  
外觀的定義。
    
         
    (6)#pragma   warning(   disable   :   4507   34;   once   :   4385;   error   :   164   )  
           
等價於:
  
            #pragma   warning(disable:4507   34)     //  
不顯示450734號警告信息
  
            #pragma   warning(once:4385)                 //   4385
號警告信息僅報告一次
  
            #pragma   warning(error:164)                 //  
164號警告信息作爲一個錯誤。
  
           
同時這個pragma   warning   也支持如下格式:
  
            #pragma   warning(   push   [   ,n   ]   )  
            #pragma   warning(   pop   )  
           
這裏n代表一個警告等級(1---4)
  
            #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   )    
           
在這段代碼的最後,重新保存所有的警告信息(包括470547064707)
  

   
7pragma   comment(...)  
              該指令將一個註釋記錄放入一個對象文件或可執行文件中。  
           
常用的lib關鍵字,可以幫我們連入一個庫文件。
  

   
8)用pragmadll中的函數
     傳統的到出 DLL 函數的方法是使用模塊定義文件 (.def)Visual C++ 提供了更簡潔方便的方法,那就是“__declspec()”關鍵字後面跟“dllexport”,告訴連接去要導出這個函數,例如: __declspec(dllexport) int __stdcall MyExportFunction(int iTest);     “__declspec(dllexport)”放在函數聲明的最前面,連接生成的 DLL 就會導出函數[email=“_MyExportFunction@4]“_MyExportFunction@4[/email]”
    
上面的導出函數的名稱也許不是我的希望的,我們希望導出的是原版的“MyExportFunction”。還好,VC 提供了一個預處理指示符“#pragma”來指定連接選項 (不僅僅是這一個功能,還有很多指示功能) ,如下:
     #pragma comment(linker,"/EXPORT:MyExportFunction=_MyExportFunction@4")
    
這下就天如人願了:)。如果你想指定導出的順序,或者只將函數導出爲序號,沒有 Entryname,這個預處理指示符 (確切地說是連接器) 都能夠實現,看看 MSDN 的語法說明:
        /EXPORT:entryname[,@ordinal[,NONAME]][,DATA]
      @ordinal
指定順序;NONAME 指定只將函數導出爲序號;DATA 關鍵字指定導出項爲數據項。

  
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的實現不同,在一個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文檔中查看。
  
一個很重要的參數

#pragma pack(n)
數據邊界對齊方式:
以如下結構爲例
: struct {
                    char a;
                    WORD b;
                    DWORD c;
                    char d;
                   }
Windows默認結構大小
: sizeof(struct) = 4+4+4+4=16;
#pragma pack(4)一樣

若設爲 #pragma pack(1), 則結構大小: sizeof(struct) = 1+2+4+1=8;
若設爲 #pragma pack(2), 則結構大小
: sizeof(struct) = 2+2+4+2=10;
#pragma pack(1):空間是節省了,但訪問速度降低了
;
在系統通訊中,如和硬件設備通信,和其他的操作系統進行通信時等,必須保證雙方的一致性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章