C C 學習筆記 預處理命令

2021-10-12 06:45:29 字數 4198 閱讀 1727

巨集定義命令 #define

條件編譯#if、#ifdef、#ifndef

#號開頭的命令稱為預處理命令;在編譯之前對原始檔進行簡單加工的過程,就稱為預處理(即預先處理、提前處理)。

#include

//引入標頭檔案

#define max 100

//巨集定義

c語言開發者們編寫了很多常用函式,並分門別類的放在了不同的檔案,這些檔案就稱為標頭檔案(header file)。每個標頭檔案中都包含了若干個功能類似的函式,呼叫某個函式時,要引入對應的標頭檔案,否則編譯器找不到函式。

實際上,標頭檔案往往只包含類的宣告和函式的宣告,也就是告訴我們類和函式怎麼用,而函式定義可以儲存在其他檔案中,在鏈結時才會找到。

標頭檔案.h盡量包含類、變數和函式的宣告,不包含定義;其他原始檔.cpp包含函式和變數的定義;主程式原始檔main.c包含主函式。

例子:ros/c++建立自己的類庫(標頭檔案和原始檔)

引入標頭檔案使用#include命令,並將檔名放在< >中,#include 和 < > 之間可以有空格,也可以沒有。

標頭檔案以.h為字尾(新的c++標準庫無字尾),而c語言**檔案以.c為字尾,它們都是文字檔案,沒有本質上的區別,#include 命令的作用也僅僅是將標頭檔案中的文字複製到當前檔案,然後和當前檔案一起編譯。你可以嘗試將標頭檔案中的內容複製到當前檔案,那樣也可以不引入標頭檔案。

#include 的用法有兩種,如下所示:

#include

#include

"myheader.h"

使用尖括號< >和雙引號" "的區別在於標頭檔案的搜尋路徑不同:

也就是說,使用雙引號比使用尖括號多了乙個查詢路徑,它的功能更為強大。

前面我們一直使用尖括號來引入標準標頭檔案,現在我們也可以使用雙引號了,如下所示:

#include

"stdio.h"

#include

"stdlib.h"

stdio.h 和 stdlib.h 都是標準標頭檔案,它們存放於系統路徑下,所以使用尖括號和雙引號都能夠成功引入;而我們自己編寫的標頭檔案,一般存放於當前專案的路徑下,所以不能使用尖括號,只能使用雙引號。建議:使用尖括號來引入標準標頭檔案,使用雙引號來引入自定義標頭檔案(自己編寫的標頭檔案),這樣一眼就能看出標頭檔案的區別巨集呼叫只是簡單的字串替換#define 叫做巨集定義命令,它也是c語言預處理命令的一種。所謂巨集定義,就是用乙個識別符號來表示乙個字串(廣義,可以是數字、表示式、if 語句、函式等),如果在後面的****現了該識別符號,那麼就全部替換成指定的字串。

常見用法

#define  巨集名  字串

//如#define n 100

#define m (n*n+3*n)

//一定要帶括號,且後面沒有分號

巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用#undef命令。

#define pi 3.14159

intmain()

#undef pi

void

func()

表示 pi 只在 main() 函式中有效,在 func() 中無效。

巨集定義允許巢狀,在巨集定義的字串中可以使用已經定義的巨集名,在巨集展開時由預處理程式層層代換。例如:

#define pi 3.1415926

#define s pi*y*y

/* pi是已定義的巨集名*/

對語句:

printf

("%f"

, s)

;

在巨集代換後變為:

printf

("%f"

,3.1415926

*y*y)

;

習慣上巨集名用大寫字母表示,以便於與變數區別。但也允許用小寫字母

巨集定義可帶引數**(用起來很複雜,容易出錯),不建議使用**

在巨集定義中的引數稱為「形式引數」,在巨集呼叫中的引數稱為「實際引數」,這點和函式有些類似。

對帶引數的巨集,在展開過程中不僅要進行字串替換,還要用實參去替換形參。

對於帶參巨集定義不僅要在引數兩側加括號,還應該在整個字串外加括號。

#define m(y) ((y)*(y)+3*(y))  

//巨集定義

// todo:k=m

(5);

//巨集呼叫

在巨集展開時,用實參 5 去代替形參 y,經預處理程式展開後的語句為k=5*5+3*5

巨集呼叫只是簡單的字串替換

#define m1(x) x*x+2*x

#define m2(x) (x)*(x)+2*(x)

#define m3(x) ((x)*(x)+2*(x))

在以下運算中有不同的結果

int a;

m1(a+1)

=a+1

*a+1+2

*a+1=4

*a+2;m2

(a+1)=

(a+1)*

(a+1)+

2*(a+1

)=a*a+

4*a+3;

100/

m2(a+1)

=100

/(a+1)

*(a+1)

+2*(a+1)

;100/m3

(a+1)=

100/

((a+1)

*(a+1)

+2*(a+1)

);

能夠根據不同情況編譯不同**、產生不同目標檔案的機制,稱為條件編譯.(屬於預處理步驟)☆預處理總結☆

預處理指令是以#號開頭的**行,# 號必須是該行除了任何空白字元外的第乙個字元。# 後是指令關鍵字,在關鍵字和 # 號之間允許存在任意個數的空白字元,整行語句構成了一條預處理指令,該指令將在編譯器進行編譯之前對源**做某些轉換。

下面是本章涉及到的部分預處理指令:

指令說明

#空指令,無任何效果

#include

包含乙個源**檔案

#define

定義巨集#undef

取消已定義的巨集

#if如果給定條件為真,則編譯下面**

#ifdef

如果巨集已經定義,則編譯下面**

#ifndef

如果巨集沒有定義,則編譯下面**

#elif

如果前面的#if給定條件不為真,當前條件為真,則編譯下面**

#endif

結束乙個#if……#else條件編譯塊

預處理功能是c語言特有的功能,它是在對源程式正式編譯前由預處理程式完成的,程式設計師在程式中用預處理命令來呼叫這些功能。

巨集定義可以帶有引數,巨集呼叫時是以實參代換形參,而不是「值傳送」。

為了避免巨集代換時發生錯誤,巨集定義中的字串應加括號,字串**現的形式引數兩邊也應加括號

檔案包含是預處理的乙個重要功能,它可用來把多個原始檔連線成乙個原始檔進行編譯,結果將生成乙個目標檔案。

條件編譯允許只編譯源程式中滿足條件的程式段,使生成的目標程式較短,從而減少了記憶體的開銷並提高了程式的效率。

使用預處理功能便於程式的修改、閱讀、移植和除錯,也便於實現模組化程式設計。

(c c 學習筆記十一)預處理命令

預處理是指在進行編譯的第一遍掃瞄 語法掃瞄和語法分析 之前所做的工作。預處理是c語言的乙個重要功能,它由預處理器負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對程式中的預處理部分作處理,處理完畢後自動進入對源程式的編譯。c語言提供了多種預處理功能,如巨集定義 檔案包含 條件編譯等。一....

C C 預處理命令

1.和 和 操作符是和 define 巨集使用的。使用 使在 後的首個引數返回為乙個帶引號的字串 例如 defineto string s s defineconcatenate x,y x y 2.define 命令用於把指定字串替換檔案中的巨集名稱 3.error 可以簡單的使編譯器在發生錯誤時...

C C中的預處理命令

分析 預編譯又稱為預處理 是做些 文字的替換工作。處理 開頭的指令 比如拷貝 include包含的檔案 define 巨集定義的替換 條件編譯等,就是為編譯做的預備工作的階段,主要處理 開始的預編譯指令,預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置。c c 編譯系統...