首頁 > 軟體

c語言的程式環境與預處理詳解

2022-02-09 10:00:42

c語言程式碼的實現包含兩種環境

1.翻譯環境,將原始碼轉化成可執行的機器指令

2.執行環境,執行程式碼

1.翻譯環境

包括兩個過程,編譯與連結
·程式中每一個原始檔通過編譯器轉化成目標檔案(obj)
·這些目標檔案又通過連結器捆綁在一起
·連結器同時會連結標準庫中的函數以及程式設計師個人的庫到程式中
·形成可執行代

編譯分成三個階段:預編譯(預處理)->編譯->組合

預處理階段

1.完成標頭檔案的參照

2.#define定義的宏與符號的替換

3.註釋的刪除

編譯階段:將程式碼轉化成組合程式碼

1.語法分析

2.詞法分析

3.語意分析

4.符號彙總

組合階段:生成符號表,將組合指令轉化成二進位制的機器指令

連結階段:將多個目標檔案與連結庫進行連結

1.合併段表

2.符號表的重定向與重定位

2.執行環境

1.在有作業系統的環境中,程式由作業系統載入到記憶體中。在獨立的環境中,這個操作手動完成。

2.程式從main函數開始執行

3.程式呼叫堆疊

4.終止程式

3.預處理詳解

3.1#define定義的符號

符號名一般大寫,後面不要加上;
#define MAX 100

3.2#define定義的宏

#define SQUARE(x) ((x) * (x))
宏的名字與引數之間不能加空格;儘量多加括號,避免錯誤

3.3#define的替換規則

#define M 100
#define MAX(X,Y)  (X) > (Y) ? (X) : (Y)

int main()
{
	int max = MAX(M,50);//這裡的M會被先替換成100
	printf("%d",max);
}

1.如果有宏,先檢視宏的引數有沒有#define定義的符號,如果有則替換

2.將替換的文字與程式中的宏替換3.再檢視是否有定義的符號,如果有則替換

替換#define定義的符號時,不會替換字串常數中的內容。
宏的引數中能出現define定義的符號,但是宏不能實現遞迴

3.4#與##

在宏的定義中(# + 引數)能將引數轉換成對應的字串

##能連線兩個符號

4.宏與函數對比

宏的優點

1.宏的引數型別不用宣告

2.當運算量較小時,宏的運算時間與程式碼量是遠小於函數的

缺點

1.宏型別無關,不夠嚴謹

2.宏不能偵錯

3.每次使用宏的時候,一份宏定義的程式碼將插入到程式中。除非宏比較短,否則可能大幅度增加程式的長度。

4.宏可能帶來運算優先順序的問題

5.#undef

用於移除宏定義

6.條件編譯

#if與#endif為一組,如果#if後的表示式為真,執行程式碼直到#endif

但是#if後面不能寫變數

多個分支的條件編譯#if,#elif,#elif,#else,#endif

判斷是否被定義
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol

7.檔案包含

#include後用雙引號,編譯器會先從本地目錄下查詢,找不到再去庫函數中找。用<>編譯器直接在庫函數中找

為了防止標頭檔案被反覆包含,用#pragma once,寫在標頭檔案第一行

或者用
#ifndef NAME
#define NAME
//標頭檔案內容
#endif

總結

到此這篇關於c語言的程式環境與預處理詳解的文章就介紹到這了,更多相關c語言程式環境與預處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com