c語言整理編譯預處理

2021-10-06 07:25:36 字數 2726 閱讀 8403

c程式執行過程:

源程式---->編譯預處理-----> 編譯------->優化程式----->匯程式設計序----->鏈結程式----->可執行檔案。

編譯預處理時,先要讀取源程式,對預處理指令(#開頭指令)以及特殊的符號進行處理,比如define 替換指令,也會進行刪除注釋,多餘的空白字元,然後產生的預處理檔案或者程式傳給編譯器,

在程式中以#開頭的編譯指令稱為預處理指令,預處理指令屬於編譯器,不是c語言中的內容,但是可以通過預處理指令可以擴充套件編譯c程式的環境。

預處理指令

預處理指令是以#號開頭的**行,#號必須是該行除了任何空白字元外的第乙個字元。

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

#include#include#  include#  includeint main()

gcc -e -o 1.e 1.c

用vim 1.e開啟可檢視預編譯檔案

預處理指令主要有以下三種:

1)包含檔案:將原始檔中以#include格式包含的檔案複製到編譯的原始檔中,可以是標頭檔案,也可以是其它的程式檔案。

2)巨集定義指令:#define指令定義乙個巨集,#undef指令刪除乙個巨集定義。

3)條件編譯:根據#ifdef#ifndef後面的條件決定需要編譯的**

檔案包含中指定的檔名即可以用引號括起來,也可以用尖括號括起來,格式如下:

#include《檔案》 加上<>系統會自動在檔案中找

寫的程式可以用

#include"檔案"   eg:#include"_public.c"       #include"_public.h"

c語言的標準標頭檔案都存放在/usr/include資料夾中,如果自己編寫的檔案不是存放在當前工作資料夾,可以在#include命令後面加在路徑。

「.h」,表示c語言程式的標頭檔案,也可以是「.c」,表示包含普通c語言源程式

巨集定義:#define   替換

在標頭檔案處定義

測試:

#include#include# include#include#define si 666

int main()

~

你好,中國

測試define si 巨集定義666

程式中si會換成666;但是字串中的si沒有替換。

帶引數的巨集,

形式:#define 巨集名(形參表) 字串   

在定義帶引數的巨集時,巨集名和形參表之間不能有空格出現,否則,就將巨集定義成為無引數形式,而導致程式出錯。

#include#include# include#include#define min(x,y) ((x)<(y) ? (x) : (y))

int main()

~

gcc - e -o 1.e 1.c  

vim 1.e  查詢 你好可以得到預編譯程式,幾千行都是包括的標頭檔案。

# 642 "/usr/include/string.h" 3 4

# 5 "1.c" 2

int main()

可以看出,在預編譯程式中 引數都被替換  

條件編譯

#ifdef命令的使用格式如下:

如果#ifdef後面的識別符號已被定義過,則對「程式段1」進行編譯;如果沒有定義識別符號,則編譯「程式段2」。一般不使用#else及後面的「程式2」。

#ifdef 識別符號

程式段 1

#else

程式段 2

#endif

eg   類似 if else語句

#define hahaguai

#includeint main()

這裡是hahaguai
注意:執行結果不是程式執行得到的,而是在預編譯時就已經得到結果了具體如下:

# 943 "/usr/include/stdio.h" 3 4

# 3 "1.c" 2

int main()

檢視預編譯檔案1.e 可以得到結果

主要考慮跨平台的可移植性,比如程式段1可以放在linux下執行的,而無法在linux下執行的,卻可以在windows下執行的,可以選用程式段2。

#ifndef 識別符號

程式段 1

#else

程式段 2 

#endif

如果未定義識別符號,則編譯「程式段1」;否則編譯「程式段2」

eg:當第一次包含headfile_1.h時,由於沒有定義_headfile_1_h,條件為真,這樣就會執行#ifndef _headfile_1_h和#endif之間的**;當第二次包含headfile_1.h時,前面一次已經定義了_headfile_1_h,條件為假,#ifndef _headfile_1_h和#endif之間的**也就不會再次被包含,這樣就避免了重定義。

C語言編譯預處理

title date br description c語言編譯預處理 2019 11 06 14 35 32 0800 預處理 c語言 c語言預處理是對源 進行初步轉換 碼農有道 c源程式 編譯預處理 編譯 優化程式 匯程式設計序 鏈結程式 可執行檔案其中編譯預處理階段,讀取c源程式,對其中的預處理...

C語言 08 編譯預處理

8.1.1 無引數的巨集定義 巨集常量 如果在程式中大量使用到了100這個值,那麼為了方便管理,我們可以將其定義為 const int num 100 但是如果我們使用num定義乙個陣列,在不支援c99標準的編譯器上是不支援的,因為num不是乙個編譯器常量,如果想得到了乙個編譯器常量,那麼可以使用 ...

《c語言深度剖析》整理 預處理

一 巨集定義 1.巨集定義的作用域 巨集定義開始,到檔案結束 其他的檔案包含巨集定義的檔案也可引用 2.巨集定義可增加 的可讀性 define error poweroff 1 若不採用巨集定義的方式,中出現 1 時,程式的可讀性變差,中出現有具體的含義的單獨的數字 比如上面 1 稱為魔鬼數,別人閱...