1. 程式人生 > 其它 >C語言_預處理

C語言_預處理

技術標籤:C語言c語言

C語言_預處理

文章目錄

0.引言

C的預處理是在程式被編譯之前執行的,包括將其他檔案包含進正在編譯的檔案,定義符號常量和巨集,條件編譯和有條件的執行預處理命令。預處理命令都以 # 開頭。

1.#include

功能:將指定檔案的一個副本包含到命令所在位置上

形式:#include<filename>

#include"filename"

區別:查詢檔案的起始位置不同。

使用引號時:會從待編譯檔案所在的目錄裡開始查詢,一般用於程式設計師自己定義的標頭檔案

使用尖括號:用於標準函式庫的標頭檔案,一般會在預先指定的編譯器和系統目錄中開始查詢

2.#define (符號常量)

格式:#define indentifier replacement_text

功能:其後出現的所有識別符號(indentifier)會在編譯前被替換為後面的替換文字

p.s.習慣上只用大寫字母和下劃線給符號常量命名

​ 這也是一種巨集,此處拆開只是為了單獨說明,而且它也更常用

​ 得到符號常量的另一途徑:利用關鍵字const進行修飾

3.#define(巨集)

巨集 ,是#define預處理命令定義的一種識別符號,巨集的定義可以帶實參,也可以不帶。不帶實參的巨集和上面的符號常量類似;而帶實參的巨集會把實參帶入巨集的替換文字中,進行展開

例子(帶實參):

#define RECTANGLE_AREA(x,y) ( (x) * (y) )

rectArea = RECTANGLE_AREA(a + 4, b + 7);

//in fact, it will be replaced by:
rectArea = (a + 4) * (b + 7);

p.s.巨集可以用 #undef撤銷

4.條件編譯

功能:只對滿足條件的程式碼進行編譯

形式:#if, #ifdef

, #ifndef

1)#if

和if,else,else if的使用很像,方法如下:

 #if 整型常量表達式1
  程式碼塊1
#elif 整型常量表達式2
  程式碼塊2
#elif 整型常量表達式3
  程式碼塊3
#else
  程式碼塊4
#endif 

2)#ifdef

#ifdef  巨集名
    程式碼塊1
#else
    程式碼塊2
#endif

意思是 如果所給出的巨集已經被定義過(即存在),則判定為真,編譯1,否則編譯2

3)#ifndef

#ifndef 巨集名
    程式碼塊1 
#else 
    程式碼塊2 
#endif

與#ifdef類似,區別在於 巨集名 處的判定是判斷巨集是否未定義,如果未定義,編譯1;否則編譯2

5.#error和#pragma預處理命令

格式:#error tokens

功能:打印出包含命令中指定標記的資訊,具體內容和系統的實現有關。

​ tokens是用空格分隔的一個字元序列

格式:#pragma tokens

功能:執行一個系統實現中已經定義好的操作,如果沒找到就忽略這個命令

6.#和##運算子

#:#運算子需用在帶實參的巨集中,其運算元就是巨集的實參,它將替換文字中的標記轉換成一個用引號引起來的字串。

例子:

#define HELLO(x)  printf("hello," # "\n");

//when we meet"HELLO(Mary)", it become:

printf("hello," "Mary" "\n");
//==
printf("hello,Mary\n");

##:用於將兩個標記拼接在一起

例子:

#define EXAMPLE(x,y)  x##y

//in the below code,when meet:
EXAMPLE(O,K)
//it will be replaced by:
EXAMPLE(OK)

例子:

#define EXAMPLE(x,y)  x##y

//in the below code,when meet:
EXAMPLE(O,K)
//it will be replaced by:
EXAMPLE(OK)

注意:##運算子必須有兩個運算元