巨集和函式的區別以及C語言的編譯鏈結過程

2021-07-23 19:34:44 字數 1762 閱讀 4548

巨集和函式的區別大致可分為以下五點:

1、巨集是完全替換,插入到程式中,會增加**的長度; 而函式**是只出現在乙個地方,使用時呼叫即可。

2、巨集的執行速度相比函式更快一些,因為在預編譯階段都已完成;函式則因為需要呼叫以及返回而需要額外時間。 

3、巨集有時因為操作符優先順序問題會導致計算邏輯出錯;

而函式會將值返回。

4、引數求值時,巨集每次使用都要進行運算;而函式只需要計算一次,之後多次呼叫不會導致求值出錯。

5、巨集不關心引數型別,只要引數操作合法即可; 而

函式型別則要一致,不同型別需要不同函式。

我們所編輯的c語言程式是不能直接放到機器上執行的,它只不過是乙個帶".c"字尾的檔案即源**,需要經過一定的處理才能轉換成機器上可執行的可執行檔案。我們將對c語言的這種處理過程稱為編譯與鏈結。

編譯就是把文字形式源**翻譯為機器語言形式的目標檔案過程。

鏈結是把目標檔案、作業系統的啟動**和用到的庫檔案進行組織最終形成可執行**的過程。

編譯是讀取源程式,對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編**,原始檔的編譯過程主要包含兩個階段:

第乙個階段是

:預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置的檔案中的預處理指令來修改原始檔的內容。如#include指令就是乙個預處理指令,他把檔案的內容新增到.c檔案中。這個在編譯之前修改原始檔的方式提供了很大的靈活性,以適應不同的計算機和作業系統環境的限制。乙個環境所需要的可執行**跟另乙個環境所需要的可執行**可能有所不同,因為可用的硬體體系結構和作業系統不同所致。在許多情況下(特別是在嵌入式開發中),可以把用於不同環境的**放在同乙個檔案中,再在預處理階段修改**,使之適應環境。

預處理階段主要是以下幾方面的處理:

(1)、巨集定義指令,如#define m 9;

(2)、條件編譯指令,如#ifdef、 #ifndef、#else、#elif、#endif等;

(3)、標頭檔案包含指令,如#include;

(4)、特殊符號,預編譯程式可以識別一些特殊的符號。

預編譯程式所完成的基本上是對源程式的"替換"工作。經過此替換後,生成乙個沒有巨集定義、沒有條件編譯指令、沒有特殊符號的輸出檔案。這個檔案的含義同沒有經過預處理的原始檔是相同的,但內容有所不同。下一步,此輸出檔案將作為編譯程式的輸出而被翻譯成為機器指令。

第二個階段是:編譯、優化,經過預編譯得到的輸出檔案中只有常量,一般都是一些指令。

編譯程式所要做的工作就是通過詞法分析和語法分析,在確認所有指令都是符合語法規則之後,將其翻譯成等價的中間**表示或彙編**。

彙編實際上指把組合語言**翻譯成目標機器指令的過程。對於被翻譯系統處理的每乙個

c語言源程式,都將最終經過這一處理而得到相應的目標檔案。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。目標檔案由段組成。通常乙個目標檔案中至少有兩個段:**段和資料段;

**段:該段中所包含的主要是程式的指令。該段一般是可讀和可執行的,但一般卻不可寫。

資料段:主要存放程式中要用到的各種全域性變數或靜態的資料。一般資料段都是可讀,可寫,可執行的。

鏈結過程是由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。

例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。

鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠按作業系統裝入執行的統一整體。

C語言 巨集和函式的區別

1,巨集 巨集定義將乙個識別符號 定義為乙個字串,源程式 中的該識別符號均以指定的字串來代替。巨集的書寫形式 define 巨集名 參數列 巨集體 2,函式 函式有庫函式和自己編寫的函式,庫函式是用來定義一些經常用的大家都知道的函式,自定義的函式是大家為了實現一些功能來自己編寫的函式 3,巨集和函式...

巨集和函式的區別(C語言)

一 長度 1 每次使用時,巨集 都被插入到程式中。除了非常小的巨集之外,程式的長度將大幅度增長。2 函式 只出現於乙個地方,每次使用這個函式時,都呼叫那個地方的同乙份 二 執行速度 1 define 巨集 更快。2 函式存在函式呼叫或返回的額外開銷。三 操作符優先順序 1 巨集引數的求值是在所有週期...

C語言巨集和函式的區別

首先巨集的使用 有標準巨集和巨集函式 標準巨集就是將乙個大寫字母或單詞定義成不可改變的常量,使用時直接文字替換,如 define n 1000巨集函式是將乙個函式簡化為大寫的字母或單詞,多次使用時會很方便。要注意的是巨集函式裡邊,表示式和引數都要帶上圓括號,否則可能會出現由於優先順序或求值順序而導致...