gcc編譯的背後 預處理 編譯 彙編和鏈結 一

2021-06-06 15:25:43 字數 2111 閱讀 1848

本次將分為四個章節來講,分別來講述一下gcc編譯背後的四個步驟。

第一部分:預處理。

相信大家對這一塊其實挺了解了,下面我就獻醜,以自己的理解再講一遍。

預處理是c語言從源**變成可執行程式的第一步,它包括標頭檔案的包含,巨集定義擴充套件,條件編譯的選擇等。

首先介紹一下預處理的命令:一共有12條預處理的命令,都是以#開頭且每個預處理命令必須獨佔一行,它的結尾沒有分號,因為它不是語句。

#if#ifdef

#ifndef

#else

#elif

#endif

#define

#undef

#line

#error

#pragma

#include

1.#if  經常用於除錯用

比如一段**我們暫時不用,那麼把這段**用#if括起來是乙個很好的選擇,如

#if 0

#endif

2.#ifdef

判斷那個巨集是否已經定義過了,如果定義了則進行相應的處理。

如#ifdef test_support

int test;

#endif

3.#ifndef 則相反,很多時候用於包含標頭檔案,避免重複包含與重複定義。

如test.h

#ifndef testdec_postprocesscodeblockmessage_h

#define testdec_postprocesscodeblockmessage_h

void testdec_postprocesscodeblockmessage(void **state);

#endif

這樣的話,不管這個test.h被包含多少次,這個函式都只會被申明一次,避免了重複申明。

4.#else則於c語言中的else 類似,#elif 則與c語言的else if 類似。

5.#define 最常見了,我就不詳細說明了,主要包含標頭檔案用的。

6.#undef  取消巨集定義

7.#line 改變__line__和__file__的內容

用法:#line number "filename"

大家可以自己測試一下。

8.#pragma

它的作用是設定編譯器的狀態或者是指示編譯器完成一些特定的動作,如

#pragma message(「訊息文字」)

當編譯器遇到這條指令時就在編譯輸出視窗中將訊息文字列印出來。

這條命令比較複雜,如果大家有興趣,可以自己再去檢視一下。

有兩個預處理操作符:#和##,它們可以在#define中使用。

操作符#通常稱為字串化的操作符,它把其後的串變成用雙引號包圍的串。例如:

#include

#define mkstr(s) #s

int main(void)

預處理程式把以下的語句:

printf(mkstr(i like c));

變成printf(「i like c」);

操作符##把兩個標記拼在一起,形成乙個新標記。例如:

#include

#define concat(a,a) a##b

int main(void)

預處理程式把以下語句:

printf(「%d」,concat(x,y));

變成printf(「%d」,xy);

操作符#和##主要作用是允許預處理程式對付某些特殊情況,多數程式中並不需要。

預定義巨集

c規範了5個固有的預定義巨集,它們是:

__line__

__file__

__date__

__time__

__stdc__

__line__和__file__包含正在編譯的程式的行號和檔名。

__date__和內容形如month/day/year(月/日/年)的串,代表原始檔翻譯成目標碼的日期。

__time__中的串代表源**編譯成目標碼的時間,形如hour:minute:second(時:分:秒)

如果__stdc__的內容是十進位制常數1,則表示編譯程式的實現符合標準c。

列印出預處理之後的結果:gcc -e hello.c

在命令列定義巨集:gcc -dmacro hello.c

gcc 預處理(預編譯),編譯,彙編,鏈結

一,預編譯 操作步驟 gcc e hello.c o hello.i 主要作用 處理關於 的指令 刪除 define,展開所有巨集定義。例 define portnumber 3333 處理條件預編譯 if,ifdef,if,elif,endif 處理 include 預編譯指令,將包含的 h 檔案...

gcc 預處理(預編譯),編譯,彙編,鏈結

一,預編譯 操作步驟 gcc e hello.c o hello.i 主要作用 處理關於 的指令 刪除 define,展開所有巨集定義。例 define portnumber 3333 處理條件預編譯 if,ifdef,if,elif,endif 處理 include 預編譯指令,將包含的 h 檔案...

GCC編譯過程(預處理 編譯 彙編 鏈結)

gcc編譯過程 預處理 編譯 彙編 鏈結 這裡gcc編譯器 是指在linux類作業系統下,windows編譯器 mingw 相當於windows版gcc 乙個c c 檔案要經過預處理 preprocessing 編譯 compilation 彙編 assembly 和鏈結 linking 等4步才能...