C語言10 預處理指令,巨集定義,條件編譯,標頭檔案

2021-10-16 12:27:46 字數 2901 閱讀 4157

1.c語言源**的編譯過程

c編譯器把源**編譯成可執行程式可分為以下步驟:

(1)預處理

處理**中的預處理指令(以#開頭的**)

gcc -e ***.c -o ***.i

(2)編譯

將源**編譯成彙編

gcc -s ***.i -o ***.s

gcc -s ***.c -o ***.s

(3)彙編

將彙編**編譯成目標檔案(機器碼)

gcc -c ***.s -o ***.o

gcc -c ***.i -o ***.o

gcc -c ***.c -o ***.o

(4)鏈結

將目標檔案(可能有多個)鏈結成可執行程式

gcc ***.o yyy.o… -o ***

gcc ***.c yyy.c… -o ***

2.預處理指令的分類

可以分為三類:巨集定義 條件編譯 包含標頭檔案

3.巨集定義

#define 預處理指令可以定義巨集,巨集名應該大寫

(1)巨集可以給數字起名字

語法:#define 巨集名 數字

在**中使用巨集在預處理階段將被替換成他所代表的內容

巨集定義和const常量有相似之處

可以使用巨集代表乙個在編寫程式時還不知道的數字或者以後可能變化的引數

注:可以定義乙個巨集不代表任何內容

1.巨集名和後面代表的內容之間不要寫"="

2.巨集定義後面不要寫分號

(2)巨集可以給計算公式(**)起名字

由於巨集的處理是純粹的字元替換,所以巨集代表表示式時,應該加上括號

#define add (3+4)

#define say_hello printf(「hello everyone!\n」)//給一段**起名

//使用巨集表示多條語句的用法

#define int_me dowhile(0)

(3)帶參巨集(巨集函式)

巨集也可以有引數,這些引數用來表示計算公式/**中未知的內容

帶參巨集的處理是通過二次替換完成,先將巨集替換成帶參表示式/語句,再將引數替換成傳入的資料。

帶參巨集不但整個表示式要加括號,引數自己也要加括號

//巨集定義

#define pi 3.14

//計算圓的面積

#define area® (pi*®*®)

帶參巨集和函式的區別:

1.函式中可以定義變數,帶參巨集不行

2.函式有返回值,帶參巨集只能將巨集名當成計算公式的計算結果

3.函式的引數有型別,帶參巨集的引數無型別

4.計算/處理過程比較簡單,不需要額外的儲存空間可以使用帶參巨集

5.帶參巨集的引數不是變數,不能當左值

4.條件編譯

使用預處理指令從原始檔中挑選出希望被編譯的語句,排除不想編譯語句,這種效果就叫條件編譯。

(1)#ifdef/ifndef … #else(可以沒有) … #endif

以上的語句可以實現條件編譯

根據某個巨集是否被定義過從兩組語句中選擇一組來編譯

其中#else可以省略

#ifdef 巨集

…;//巨集被定義語句被編譯

#else//可選

…;#endif

#ifndef 巨集

…;//巨集未被定義條件成立語句被編譯

#else//可選

…;#endif

(2)#if … #elif(多個) … #else(可以沒有) … #endif

以上的語句也可以實現條件編譯的效果

根據邏輯表示式的結果從多組語句中選擇一組來進行編譯

該邏輯表示式在預處理階段能計算出結果(只能使用巨集和數字)

邏輯表示式中可以使用所有的邏輯和關係操作符

#if 邏輯表示式1

…;#elif 邏輯表示式2

…;#else

…;#endif

5.標頭檔案

包含標頭檔案的語法也屬於預處理指令,作用就是將標頭檔案中的內容拷貝到這條預處理指令位置。

#include -------------- 從系統指定位置查詢標頭檔案

#include 「***.h」 -------------- 從當前位置查詢標頭檔案

(1)多檔案程式設計

c程式允許有多個.c的源**,乙個原始檔中可以有多個函式,乙個函式只能屬於乙個檔案。編譯多程式可以用gcc命令將所有的.c檔案一起進行編譯

gcc ***.c yyy.c zzz.c… -o ***

多檔案程式設計中使用乙個專門的檔案(main.c)來包含主函式。其他函式放到其他檔案中。

在多檔案程式設計中,多個檔案之間會有很多公共資源,為了避免這些公共資源重複編寫和編譯,c語言設計了標頭檔案來記錄這些公共資源。原始檔只需要包含標頭檔案即可。

那些是公共資源?需要寫到頭檔案中

普通函式宣告

全域性變數的外部宣告

巨集定義結構體 聯合體 列舉的宣告

其他標頭檔案

標頭檔案的語法:

#ifndef 巨集名//巨集名未被定義,以下內容就編譯。否則不編譯

#define 巨集名

…//標頭檔案的具體內容

#endif

標頭檔案中巨集名應該和標頭檔案檔名一一對應

標頭檔案中條件編譯的語法確保了標頭檔案的內容在整個程式中只被編譯一次

程式設計時需要給每乙個原始檔(main.c除外)設計乙個標頭檔案,原始檔對應的標頭檔案名字和原始檔相同(字尾不同,標頭檔案的字尾是.h)

原始檔需要包含的標頭檔案:

1.配對的標頭檔案

2.使用了該標頭檔案中宣告的公共資源(函式,變數,巨集,…)

(2)extern

宣告全域性變數時加上extern關鍵字表示該宣告語句不分配記憶體,僅僅表示這個變數存在,內存在其他檔案中分配。

如果在乙個.c檔案中使用了另乙個.c檔案中宣告的全域性變數,使用前需要用extern關鍵字將該全域性變數宣告一次。外部宣告是一定不要賦值

C語言 巨集定義,預處理巨集

巨集是學習任何語言所不可缺少的,優秀的巨集定義可以使得 變得很簡潔且高效,有效地提高程式設計效率。巨集是一種預處理指令,它提供了一種機制,可以用來替換源 中的字串,直譯器或編譯器在遇到巨集時會自動進行這一模式替換 c語言有簡單的巨集系統,由編譯器或彙編器的預處理器實現。c的巨集預處理器的工作只是簡單...

c語言預處理 巨集定義

個人筆記 巨集定義對於用c語言程式設計的人是經常用,這裡只講使用中需注意的問題點和方便的用法。1.巨集擴充套件中空格對擴充套件結果的影響 define a y a expanded y a x 被擴充套件為 a expanded x define a y a expanded y a x 被擴充套件...

預處理 巨集定義 條件編譯

可以用 define命令將乙個指定的識別符號 即巨集名 來代表乙個字串 巨集定義語法 define 巨集名 字串 使用原則 1 原樣替換 2 不能代替函式 3 定義時字尾不要加分號。帶引數的巨集定義 include define s a,b a b 注意,此處不能加分號,否則就變成了s a b in...