最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言程序的編譯與預(yù)處理詳解

 更新時間:2021年10月13日 08:32:39   作者:股神。  
這篇文章主要介紹了C語言程序的編譯與預(yù)處理,包括介紹了C和C++混合編程的情況,需要的朋友可以參考下,希望能夠給你帶來幫助

一、程序的編譯

我們寫的源文件(*.c)是經(jīng)過怎樣的處理生產(chǎn)可執(zhí)行文件(*.exe)的呢?這種處理有兩個步驟—編譯和鏈接。源文件在編譯階段通過編譯器將每個源文件轉(zhuǎn)換為目標(biāo)文件(這些文件是可執(zhí)行的機(jī)器指令),再通過鏈接器將其捆綁到一起,生成一個完整的可執(zhí)行程序。

1、 編譯階段

編譯階段可細(xì)分為3個階段:預(yù)處理(即預(yù)編譯)、編譯、匯編

預(yù)處理:主要進(jìn)行頭文件的包含、處理預(yù)處理指令(如:#define定義符號的替換)、刪除注釋。此時(*.c)文件轉(zhuǎn)換為(*.i)文件。

編譯:主要進(jìn)行語法分析、詞法分析、語義分析、符號匯總,此階段會將c語言代碼轉(zhuǎn)換為匯編代碼。此時(*.i)文件轉(zhuǎn)換為(*.s)文件。

匯編:此階段會形成符號表,將匯編代碼轉(zhuǎn)換為二進(jìn)制指令(機(jī)器指令)。此時(*.s)文件轉(zhuǎn)換為(*.o)文件。

2、鏈接

此階段主要完成合并段表、符號表的合并和重定位工作,將(*.o)文件鏈接到一起生成可執(zhí)行文件。

二、預(yù)處理詳解

1、預(yù)定義符號

__FILE__      //進(jìn)行編譯的源文件
__LINE__     //文件當(dāng)前的行號
__DATE__    //文件被編譯的日期
__TIME__    //文件被編譯的時間
__STDC__    //如果編譯器遵循ANSI C,其值為1;如果不遵循,則編譯器不認(rèn)識這個符號,是個未定義標(biāo)識符,此時使用這個符號程序會報錯。該符號的作用是判斷編譯器是否遵循ANSI C。

下面為大家展示這些符號的作用。

執(zhí)行結(jié)果為:

2、#define定義的標(biāo)識符

語法:

#define MAX 100

這句代碼的意思是數(shù)字“100”替換成符號MAX,例如:

#include <stdio.h>
#define MAX 100
int main()
{
	int i = 1 + MAX;
	printf("%d", i);
	return 0;
}

結(jié)果:

注意:define定義的標(biāo)識符只進(jìn)行替換,并不會在替換過程中執(zhí)行運(yùn)算,例如

#include <stdio.h>
#define MAX 5+5
int main()
{
	int i = 10;
	int x = i * MAX;
	printf("%d", x);
	return 0;
}

這個程序的結(jié)果是多少呢?100嗎?答案其實是55,因為define只是簡單的替換,i*MAX其實本質(zhì)是i*5+5,即10*5+5=55.

3、#define定義的宏

語法:

#define SQUARE(x) x * x

當(dāng)我們在程序中寫下:SQUARE(5)這句代碼,這預(yù)處理時,這句代碼就會被替換成5*5。例如:

#include <stdio.h>
#define SQUARE(x) (x) * (x)
int main()
{
	int i = SQUARE(5);
	printf("%d", i);
	return 0;
}

程序結(jié)果為:

注意:同樣的#define定義的宏也只是進(jìn)行簡單的替換。

例如:

#include <stdio.h>
#define SQUARE(x) x * x
int main()
{
	int a = 5;
	int i = SQUARE(a+1);
	printf("%d", i);
	return 0;
}

這個程序的結(jié)果是什么呢?答案是11,SQUARE(a+1)等同于SQUARE(5+1),即5+1*5+1=11,而不是6*6=36。

宏常常被用于執(zhí)行簡單的運(yùn)算,比如在兩個數(shù)中找出較大的一個。

#define MAX(a, b) ((a)>(b)?(a):(b))

那么為什么不用函數(shù)呢,因為宏有兩個優(yōu)勢:

1. 用于調(diào)用函數(shù)和從函數(shù)返回的代碼可能比實際執(zhí)行這個小型計算工作所需要的時間更多。所以宏比函數(shù)在程序 的規(guī)模和速度方面更勝一籌。

2. 更為重要的是函數(shù)的參數(shù)必須聲明為特定的類型。所以函數(shù)只能在類型合適的表達(dá)式上使用。反之這個宏怎可 以適用于整形、長整型、浮點型等可以用于>來比較的類型。宏是類型無關(guān)的。

但宏也有劣勢:

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

2. 宏是沒法調(diào)試的。

3. 宏由于類型無關(guān),也就不夠嚴(yán)謹(jǐn)

4. 宏可能會帶來運(yùn)算符優(yōu)先級的問題,導(dǎo)致程容易出現(xiàn)錯。(就是上面我提醒大家需要注意的地方)

4、#unef

這條指令用于移除一個#define定義標(biāo)識符或宏定義。

例如:

#define	MAX 100
int main()
{
	int m = MAX;
#undef MAX
	int n = MAX;//err
	return 0;
}

這個程序會報錯,因為那個int n=MAX中的MAX的定義被移除了,而其他的不會(m仍然是正確的)。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語言實現(xiàn)linux網(wǎng)卡連接檢測的方法

    C語言實現(xiàn)linux網(wǎng)卡連接檢測的方法

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)linux網(wǎng)卡連接檢測的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)

    C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)

    C++入門基礎(chǔ)篇的內(nèi)容為C++的基本特性,只有在掌握C++的基本特性后,是進(jìn)入后面類和對象學(xué)習(xí)的基礎(chǔ),下面這篇文章主要給大家介紹了關(guān)于C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • C++之std::vector刪除元素的幾種方式及區(qū)別說明

    C++之std::vector刪除元素的幾種方式及區(qū)別說明

    這篇文章主要介紹了C++之std::vector刪除元素的幾種方式及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 詳細(xì)分析C++ 多態(tài)和虛函數(shù)

    詳細(xì)分析C++ 多態(tài)和虛函數(shù)

    這篇文章主要介紹了C++ 多態(tài)和虛函數(shù)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C++修煉之拷貝構(gòu)造函數(shù)

    C++修煉之拷貝構(gòu)造函數(shù)

    這篇文章主要內(nèi)容是6個默認(rèn)成員函數(shù)之一的拷貝構(gòu)造函數(shù)的認(rèn)識與學(xué)習(xí),讓同學(xué)們充分理解淺拷貝與深拷貝,感興趣的小伙伴可以參考閱讀
    2023-04-04
  • C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實例

    C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實例

    這篇文章主要介紹了C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實例,并且轉(zhuǎn)換后會統(tǒng)計二進(jìn)制1的個數(shù),實例簡單明了,需要的朋友可以參考下
    2014-06-06
  • C++基礎(chǔ)之this指針與另一種“多態(tài)”

    C++基礎(chǔ)之this指針與另一種“多態(tài)”

    this指針識別了同一個類的不同的對象,換句話說,this指針使得成員函數(shù)可以訪問同一個類的不同對象。再深入一點,this指針使得成員函數(shù)會因為this指針的不同而訪問到了不同的成員變量
    2013-07-07
  • 基于C++實現(xiàn)的線程休眠代碼

    基于C++實現(xiàn)的線程休眠代碼

    這篇文章主要介紹了基于C++實現(xiàn)的線程休眠代碼,包括了Linux平臺及基于boost庫的兩種實現(xiàn)方法,有不錯的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • 利用c語言實現(xiàn)卷積碼編碼器示例

    利用c語言實現(xiàn)卷積碼編碼器示例

    這篇文章主要介紹了利用c語言實現(xiàn)卷積碼編碼器示例,需要的朋友可以參考下
    2014-03-03
  • C++最優(yōu)二叉樹哈夫曼樹算法解析

    C++最優(yōu)二叉樹哈夫曼樹算法解析

    這篇文章主要介紹了C++最優(yōu)二叉樹哈夫曼樹算法解析,哈夫曼樹又稱最優(yōu)二叉樹,是一種帶權(quán)路徑長度最短的二叉樹,所謂樹的帶權(quán)路徑長度,就是樹中所有的葉結(jié)點的權(quán)值乘上其到根結(jié)點的路徑長度,需要的朋友可以參考下
    2023-08-08

最新評論

新蔡县| 邢台市| 东乌珠穆沁旗| 鄂尔多斯市| 遂宁市| 炎陵县| 清新县| 临猗县| 宁南县| 九江县| 涿鹿县| 建昌县| 香港 | 贵州省| 勐海县| 正阳县| 盘山县| 车致| 雅江县| 禹州市| 蒲江县| 上饶市| 杨浦区| 泽州县| 皋兰县| 新绛县| 唐山市| 拉孜县| 苍梧县| 长丰县| 渑池县| 博兴县| 信丰县| 宿松县| 名山县| 密云县| 郓城县| 惠安县| 金秀| 兴和县| 林口县|