預處理是在編譯之前的處理,而編譯工作的任務之一就是語法檢查,預處理不做語法檢查。預處理命令以符號「#」開頭。
常用的預處理指令包括:
巨集定義
巨集定義又稱為巨集代換、巨集替換,簡稱「巨集」。巨集替換只作替換,不做計算,不做表示式求解。巨集定義分帶引數的巨集定義和不帶引數的巨集定義。在帶引數的巨集定義,巨集名和引數的括號間不能有空格。
巨集定義不分配記憶體,變數定義分配記憶體。
巨集展開不佔執行時間,只佔編譯時間;函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)。
出現在巨集定義中的#運算子把跟在其後的引數轉換成乙個字串,有時把這種用法的#稱為字串化運算子。例如:
#includeusing輸出結果為:namespace
std;
#define str(n)"abcd"#n
intmain()
##運算子用於把引數連線到一起,預處理程式把出現在##兩側的引數合併成乙個符號。例如:
#includeusing輸出結果為:namespace
std;
#define str(a,b,c) a##b##c
intmain()
檔案包含
#include《檔名》稱為標準方式,到系統頭檔案目錄查詢檔案,#include"檔名"則先在當前目錄(使用者路徑)查詢,而後到系統頭檔案目錄查詢。
我們以#include和#include為例說明:iostream.h是c語言格式的頭(庫)檔案,為舊版本的標準庫,只支援窄字符集;而iostream為c++的標準標頭檔案,支援窄字符集和寬字符集。
被包含檔案中的靜態全域性變數不用在包含檔案中宣告。
條件編譯
使用條件編譯可以使目標程式變小,執行時間變短。
#undef指令,用來刪除事先定義的巨集定義, 其一般形式為:
#undef 巨集替換名
錯誤資訊指令
#error指令,
該指令用於程式的除錯
,輸出乙個錯誤資訊,當編譯中遇到#error指令就停止編譯。
其一般形式為:
#error 出錯資訊。
#ifndef __cplusplus#line指令命令#line改變_line_與_file_的內容,它們是在編譯程式中預先定義的識別符號。#error this is not a c++ complier.
#endif
#include
using
namespace
std;
intmain()
其格式為:#line number [ filename ],這條指令可以改變當前的行號和檔名。
#includeusing執行結果:namespace
std;
#line 100 "a.cpp"
intmain()
布局控制指令
在所有的預處理指令中,#pragma 指令可能是最複雜的了,它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了乙個方法,在保持與c和c++語言完全相容的情況下,給出主機或作業系統專有的特徵。依據定義,編譯指示是機器或作業系統專有的,且對於每個編譯器都是不同的。
其格式一般為: #pragma para,其中para 為引數。
message 引數:在編譯資訊輸出視窗中輸出相應的資訊
#pragma message("訊息文字")code_seg引數:設定程式中函式**存放的**段,當我們開發驅動程式的時候就會使用到它
#pragma code_seg(["section-name"[,"section-class"]])#pragma once:
只要在標頭檔案的最開始加入這條指令就能夠保證標頭檔案被編譯一次,但移植性差。如果寫的程式要跨平台,最好使用c++中的巨集定義。
#pragma hdrstop:表示預編譯標頭檔案到此為止,後面的標頭檔案不進行預編譯。
#pragma resource:
#pragma resource "winform.dfm"表示把winform.dfm檔案中的資源加入工程,winform.dfm中包括窗體外觀的定義。
#pragma warning:輸出警告資訊。
我們執行一下程式:
int會出現如下警告資訊:main()
1>clcompile:若我們在程式上方新增:1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning c4305: 「初始化」: 從「double」到「float
」截斷1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning c4244: 「初始化」: 從「float」轉換到「int」,可能丟失資料
#pragma warning(disable:4305)則編譯時警告資訊會變為:
1>clcompile:若我們在程式上方新增:1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): warning c4244: 「初始化」: 從「float」轉換到「int」,可能丟失資料
#pragma warning(error:4244)則警告資訊會變為錯誤資訊:
1>clcompile:#pragma comment:該指令將乙個注釋記錄放入乙個物件檔案或可執行檔案中。1>f.cpp
1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(12): warning c4305: 「初始化」: 從「double」到「float
」截斷1>c:\users\gaohongchen\desktop\45\5\5\f.cpp(13): error c4244: 「初始化」: 從「float」轉換到「int」,可能丟失資料
常用的lib關鍵字,可以幫我們連入乙個庫檔案。例如:
#pragma comment(lib,"wsock32.lib")#pragma disable:在函式前宣告,只對乙個函式有效。該函式呼叫過程中將不可被中斷。一般在c51中使用較多。
C C 預處理指令
預處理指令是以 號開頭的 行。號必須是該行除了任何空白字元外的第乙個字元。後是指令關鍵字,在關鍵字和 號之間允許存在任意個數的空白字元。整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源 做某些轉換。1.和 1 define pi 3.1415926 2 define paste n a...
C C 預處理指令
預處理指令 preprocessor directives define undef ifdef ifndef if endif else and elif line error include 預定義識別符號 pragma 預處理指令是我們寫在程式 中的給預處理器 preprocessor 的命令...
C C 編譯預處理指令
眾所周知,你的程式編譯前要做的事就是掃瞄源 對其做初步的轉換,產生新的源 提供給編譯器,這個過程就叫編譯預處理。這個處理過程由預處理器來完成,預處理器是在程式真正執行前由編譯器呼叫的預處理程式。常見的預處理有以下三種 include 是一種最為常見的預處理,主要是做為檔案的引用組合源程式正文。巨集替...