C++中的預處理(下) (轉)
其他預編譯指令
除了上面我們說的集中常用的編譯指令,還有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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++中的預處理(上) (轉)C++
- C與C++中的異常處理 (轉)C++
- C與C++中的異常處理11 (轉)C++
- C與C++中的異常處理13 (轉)C++
- C與C++中的異常處理12 (轉)C++
- C與C++中的異常處理14 (轉)C++
- C與C++中的異常處理15 (轉)C++
- C與C++中的異常處理16 (轉)C++
- C與C++中的異常處理17 (轉)C++
- C與C++中的異常處理3 (轉)C++
- C與C++中的異常處理4 (轉)C++
- C與C++中的異常處理5 (轉)C++
- C與C++中的異常處理7 (轉)C++
- C與C++中的異常處理6 (轉)C++
- C與C++中的異常處理9 (轉)C++
- C與C++中的異常處理8 (轉)C++
- C與C++中的異常處理10 (轉)C++
- 關於自動付款中預付款的處理-轉
- c++異常處理 (轉)C++
- C++中的字串編碼處理C++字串編碼
- C與C++中的異常處理2(part2) (轉)C++
- C與C++中的異常處理2(part1) (轉)C++
- [C++]函式與編譯預處理(一)C++函式編譯
- [C++]函式與編譯預處理(二)C++函式編譯
- C++ BUILDER 訊息處理的深入探索 (轉)C++UI
- vim下處理文件中的 字元字元
- Recoil 中預設值的正確處理
- 處理JSP中的中文 (轉)JS
- Jive中的分頁處理 (轉)
- 特徵工程之資料預處理(下)特徵工程
- Linux 下 C++ 異常處理技巧LinuxC++
- 深度學習中的資料預處理方法深度學習
- [轉] Scala 中的非同步事件處理非同步事件
- 批處理中的for詳解(轉載)
- C/C++預處理、編譯、連結過程【Z】C++編譯
- 影像預處理
- 預處理指令
- 預處理命令