解析#pragma指令


  在所有的預處理指令中,#Pragma   指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和C++語言完全兼容的情況下,給出主機或操作系統專有的特徵。依據定義,編譯指示是機器或操作系統專有的,且對於每個編譯器都是不同的。     
  其格式一般爲:   #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)   //   不顯示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   comment(...)     
  該指令將一個註釋記錄放入一個對象文件或可執行文件中。     
  常用的lib關鍵字,可以幫我們連入一個庫文件。   
    
  (8)#pragma   pack()     
  我們知道在VC中,對於想結構體Struct這樣的類型,VC採用8字節對齊的方式,如果我們不想使用8字節對齊(在網絡變成中經常需要這樣),我們可以在結構體前面加上     
  #pragma   pack(1)     
  struct     
  {     
  ......     
  }     
  #pragma   pack()    

 

#if !defined(AFX_MULTICASTCHAT_H__0F627985_5A90_11D5_B587_00E04C39B036__INCLUDED_) 
#define AFX_MULTICASTCHAT_H__0F627985_5A90_11D5_B587_00E04C39B036__INCLUDED_ 
這是爲了防止重複包含頭文件。 

#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
這也是爲了防止重複包含頭文件。 

#ifndef __AFXWIN_H__ 
#error include 'stdafx.h' before including this file for PCH 
#endif 
這是要求所有源代碼模塊都包含預編譯頭文件,假如沒包含就報錯。

發佈了20 篇原創文章 · 獲贊 3 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章