C++中的預處理(下) (轉)

gugu99發表於2007-08-15
C++中的預處理(下) (轉)[@more@]

其他預編譯指令
  除了上面我們說的集中常用的編譯指令,還有3種不太常見的編譯指令:#line、#error、#pragma,我們接下來就簡單的談一下。
  #line的語法如下:
  #line number filename
  例如:#line 30  a.h  其中,名a.h可以省略不寫。
  這條指令可以改變當前的行號和檔名,例如上面的這條預處理指令就可以改變當前的行號為30,檔名是a.h。初看起來似乎沒有什麼用,不過,他還是有點用的,那就是用在的編寫中,我們知道編譯器對C++原始碼編譯過程中會產生一些中間檔案,透過這條指令,可以保證檔名是固定的,不會被這些中間檔案代替,有利於進行分析。
  #error語法如下:
  #error  info
  例如:#ifndef
  #error This software requires the UNIX OS.
  #endif
  這條指令主要是給出錯誤資訊,上面的這個例子就是,如果沒有在UNIX環境下,就會輸出This software requires the UNIX OS.然後誘發編譯器終止。所以總的來說,這條指令的目的就是在崩潰之前能夠給出一定的資訊。
  至於#pragma,我們在《解析#pragma指令 》一文中有過介紹,我們在這裡再補充幾句,#pragma是非統一的,他要依靠各個編譯器生產者,例如,在SUN C++編譯器中:
  // 把name和val的起始地址調整為8個位元組的倍數
  #progma align 8 (name, val)
  char  name[9];
  double val;

  程式開始,MyFunction
  #progma init (MyFunction)

預定義識別符號
  為了處理一些有用的資訊,預處理定義了一些預處理識別符號,雖然各種編譯器的預處理識別符號不盡相同,但是他們都會處理下面的4種:
  __FILE__  正在編譯的檔案的名字
  __LINE__  正在編譯的檔案的行號
  __DATE__  編譯時刻的日期字串,例如: "25 Dec 2000"
  __TIME__  編譯時刻的時間字串,例如: "12:30:55"
  例如:cout<

預處理何去何從
  在《淺析C++裡面的宏》一文中,我們提到了如何取代#include預處理指令,我們在這裡就不再一一討論了。
  C++並沒有為#include提供替代形式,但是namespace提供了一種作用域機制,它能以某種方式支援組合,利用它可以改善#include的行為方式,但是我們還是無法取代#include。
  #progma應該算是一個可有可無的預處理指令,按照C++之父Bjarne的話說,就是:“#progma被過分的經常的用於將語言語義的變形隱藏到編譯裡,或者被用於提供帶有特殊語義和笨拙語法的語言擴充。”
  對於#ifdef,我們仍然束手無策,就算是我們利用if語句和常量,仍然不足以替代她,因為一個if語句的正文必須在語法上正確,滿足類檢查,即使他處在一個絕不會被執行的分支裡面。
  最後,我們以Bjarne博士的話作為結尾:“最後---在許多年之後---將Cpp放逐刀程式開發環境裡,與其它附加性語言工具放到一起,那裡才是她應該呆的地方。”


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-958711/,如需轉載,請註明出處,否則將追究法律責任。

相關文章