VC中預處理指令的詳解

2021-03-31 08:57:01 字數 3550 閱讀 6249

在所有的預處理指令中,#pragma  指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了乙個方法,在保持與c和c++語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。  

其格式一般為:        #pragma  para  

其中para  為引數,下面來看一些常用的引數。  

(1)message  引數。

只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次,這條指令實際上在vc6中就已經有了,但是考慮到相容性並沒有太多的使用它。  

(4)#pragma  hdrstop表示預編譯標頭檔案到此為止,後面的標頭檔案不進行預編譯。

bcb可以預編譯標頭檔案以加快鏈結的速度,但如果所有標頭檔案都進行預編譯又可能占太多磁碟空間,所以使用這個選項排除一些標頭檔案。    

有時單元之間有依賴關係,比如單元a依賴單元b,所以單元b要先於單元a編譯。你可以用#pragma  startup指定編譯優先順序,如果使用了#pragma  package(**art_init)  ,bcb就會根據優先順序的大小先後編譯。    

(5)#pragma  resource"*.dfm"表示把*.dfm檔案中的資源加入工程。*.dfm中包括窗體  

外觀的定義。    

(6)#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  也支援如下格式:  

#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  )    

在這段**的最後,重新儲存所有的警告資訊(包括4705,4706和4707)。  

(7)pragma  ***ment(...)  

該指令將乙個注釋記錄放入乙個物件檔案或可執行檔案中。  

常用的lib關鍵字,可以幫我們連入乙個庫檔案。  

(8)用pragma匯出dll中的函式

    傳統的到出 dll 函式的方法是使用模組定義檔案 (.def),visual c++ 提供了更簡潔方便的方法,那就是「__declspec()」關鍵字後面跟「dllexport」,告訴連線去要匯出這個函式,例如:__declspec(dllexport) int __stdcall myexportfunction(int itest);    把「__declspec(dllexport)」放在函式宣告的最前面,連線生成的 dll 就會匯出函式「_myexportfunction@4」。

上面的匯出函式的名稱也許不是我的希望的,我們希望匯出的是原版的「myexportfunction」。還好,vc 提供了乙個預處理指示符「#pragma」來指定連線選項 (不僅僅是這乙個功能,還有很多指示功能) ,如下:

#pragma ***ment(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  ***  is  never  used  in  function  ***」,可以這樣:  

#pragma  warn  —100            //  turn  off  the  warning  message  for  warning  #100  

int  insert_record(rec  *r)  

#pragma  warn  +100                        //  turn  the  warning  message  for  warning  #100  back  on  

函式會產生一條有唯一特徵碼100的警告資訊,如此可暫時終止該警告。  

每個編譯器對#pragma的實現不同,在乙個編譯器中有效在別的編譯器中幾乎無效。可從編譯器的文件中檢視。  

乙個很重要的引數

#pragma pack(n)

資料邊界對齊方式:

以如下結構為例: struct

在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)時:空間是節省了,但訪問速度降低了;

有什麼用處???

在系統通訊中,如和硬體裝置通訊,和其他的作業系統進行通訊時等,必須保證雙方的一致性。

C 中的預處理指令詳解

這篇文章主要介紹了c 中的預處理指令詳解,本文講解了 define 和 undef if elif else和 endif warning和 error region和 endregion line pragma等預處理指令,需要的朋友可以參考下 目錄 1.define 和 undef 2.if e...

pragma 預處理指令詳解

pragma 預處理指令詳解 在所有的預處理指令中,pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。pragma指令對每個編譯器給出了乙個方法,在保持與c和c 語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有...

pragma 預處理指令詳解

7 pragma comment 該指令將乙個注釋記錄放入乙個物件檔案或可執行檔案中。常用的lib關鍵字,可以幫我們連入乙個庫檔案。每個編譯程式可以用 pragma指令啟用或終止該編譯程式支援的一些編譯功能。例如,對迴圈優化功能 pragma loop opt on 啟用 pragma loop o...