??????????????????????????????
????????????秋已深??????????????
???????? ???? 冬將至 ????????????
??????????人間至此秋色盡??????????
??????????一世繁華一世荒??????????
??????????????????????????????
??程序環(huán)境
??程序翻譯環(huán)境
在這個(gè)環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機(jī)器指令。 |
??程序執(zhí)行環(huán)境
1. 程序必須載入內(nèi)存中。在有操作系統(tǒng)的環(huán)境中:一般這個(gè)由操作系統(tǒng)完成。在獨(dú)立的環(huán)境中,程序的載入必須由手工安排,也可能是通過可執(zhí)行代碼置入只讀內(nèi)存來完成。 |
2. 程序的執(zhí)行便開始。接著便調(diào)用main函數(shù)。 |
3. 開始執(zhí)行程序代碼。這個(gè)時(shí)候程序?qū)⑹褂靡粋€(gè)運(yùn)行時(shí)堆棧(stack),存儲(chǔ)函數(shù)的局部變量和返回地址。程序同時(shí)也可以使用靜態(tài)(static)內(nèi)存,存儲(chǔ)于靜態(tài)內(nèi)存中的變量在程序的整個(gè)執(zhí)行過程一直保留他們的值。 |
4. 終止程序。正常終止main函數(shù);也有可能是意外終止。 |
??程序預(yù)處理
??相關(guān)符號(hào)介紹
???預(yù)定義符號(hào)
NULL:表示空指針,用于指示指針變量沒有指向任何對(duì)象。 |
EOF:表示文件結(jié)束符,用于在文件輸入時(shí)表示已經(jīng)到達(dá)文件末尾。 |
sizeof:用于獲取數(shù)據(jù)類型或變量所占用的內(nèi)存空間大小。 |
const:用于聲明常量,表示其值不可修改。 |
volatile:用于聲明變量的值可能會(huì)在程序運(yùn)行期間被意外修改。 |
signed:用于聲明有符號(hào)類型的變量,可以表示正數(shù)和負(fù)數(shù)。 |
unsigned:用于聲明無符號(hào)類型的變量,只能表示非負(fù)整數(shù)。 |
void:用于聲明無類型類型的變量或函數(shù),表示不返回任何值。 |
do-while:用于創(chuàng)建循環(huán)結(jié)構(gòu),先執(zhí)行循環(huán)體,再判斷循環(huán)條件。 |
for:用于創(chuàng)建循環(huán)結(jié)構(gòu),通常用于需要執(zhí)行固定次數(shù)的循環(huán)操作。 |
if:用于條件判斷,根據(jù)條件是否成立來執(zhí)行不同的代碼塊。 |
switch:用于多分支條件判斷,根據(jù)不同的條件執(zhí)行不同的代碼塊。 |
while:用于循環(huán)結(jié)構(gòu),先判斷循環(huán)條件,再執(zhí)行循環(huán)體。 |
...... |
這些都是一些普通的預(yù)定義符號(hào)
__FILE__ //進(jìn)行編譯的源文件
__LINE__ //文件當(dāng)前的行號(hào)
__DATE__ //文件被編譯的日期
__TIME__ //文件被編譯的時(shí)間
__STDC__ //如果編譯器遵循ANSI C,其值為1,否則未定義
這些都是C語言內(nèi)置的預(yù)定義符號(hào)。大家可以試著去編譯下,看看效果,平常我們都很少用到。
???#define定義標(biāo)識(shí)符
在C語言中,#define是預(yù)處理指令,它用來定義標(biāo)識(shí)符或常量。當(dāng)你使用#define定義一個(gè)標(biāo)識(shí)符時(shí),編譯器會(huì)將其替換為你在定義時(shí)指定的文本。例如,你可以使用#define定義一個(gè)常量:
#define PI 3.14159
//在這個(gè)例子中,當(dāng)你使用PI時(shí),編譯器會(huì)將其替換為3.14159。
#define max 100
//在這個(gè)例子中,當(dāng)你使用PI時(shí),編譯器會(huì)將其替換為3.14159。
???define定義宏
#define Add(x) ((x) * (x))
//在這個(gè)例子中,Add(x)會(huì)被替換為((x) * (x))。
//注意宏的參數(shù)在替換時(shí)需要用括號(hào)括起來,以避免因?yàn)檫\(yùn)算符優(yōu)先級(jí)產(chǎn)生的問題。
//例如,如果你不使用括號(hào),Add(x + 2)會(huì)被展開為x + 2 * x + 2,而不是你預(yù)期的(x + 2) * (x + 2)。
需要注意的是,#define定義的標(biāo)識(shí)符在預(yù)處理階段就會(huì)被展開,而不會(huì)在運(yùn)行時(shí)進(jìn)行計(jì)算。因此,使用宏進(jìn)行計(jì)算可能會(huì)影響程序的性能。
注意:
- 宏參數(shù)和#define 定義中可以出現(xiàn)其他#define定義的符號(hào)。但 是對(duì)于宏,不能出現(xiàn)遞歸。
- 當(dāng)預(yù)處理器搜索#define定義的符號(hào)的時(shí)候,字符串常量的內(nèi)容并不被搜索。
??宏和函數(shù)的對(duì)比
宏和函數(shù)在C語言中都用于實(shí)現(xiàn)代碼的復(fù)用和簡(jiǎn)化,但它們?cè)趯?shí)現(xiàn)方式和用途上有一些不同。 |
執(zhí)行方式:函數(shù)在程序運(yùn)行時(shí)被調(diào)用,執(zhí)行對(duì)應(yīng)的代碼塊。宏在預(yù)處理階段進(jìn)行文本替換,不占用函數(shù)調(diào)用的時(shí)間和空間。 |
類型檢查:函數(shù)具有強(qiáng)類型檢查,編譯器會(huì)檢查函數(shù)參數(shù)類型和返回值類型。宏在替換時(shí)不會(huì)進(jìn)行類型檢查,容易出現(xiàn)錯(cuò)誤。 |
安全性:函數(shù)是安全的,因?yàn)樗鼈冇袇?shù)類型檢查和返回值。宏可能會(huì)出現(xiàn)錯(cuò)誤或不安全的表達(dá)式。 |
調(diào)試:函數(shù)可以設(shè)置斷點(diǎn)進(jìn)行調(diào)試,而宏不能進(jìn)行調(diào)試。 |
作用域:函數(shù)具有局部作用域,宏具有全局作用域。 |
性能:函數(shù)調(diào)用需要一定的開銷,包括保存寄存器、棧操作等。宏替換沒有這些開銷,但可能會(huì)增加代碼大小,降低運(yùn)行速度。 |
使用場(chǎng)景:函數(shù)是可重用的代碼塊,通常用于封裝復(fù)雜邏輯。宏通常用于替換簡(jiǎn)單的文本或常量,提高代碼可讀性。 |
在實(shí)際編程中,應(yīng)根據(jù)具體需求選擇使用宏還是函數(shù)。如果需要類型檢查、安全性高或需要調(diào)試的代碼塊,應(yīng)使用函數(shù)。如果需要替換簡(jiǎn)單的文本或常量,提高代碼可讀性,可以使用宏。
??其它預(yù)處理命名
除了#define,C語言中還有其他一些預(yù)處理命名,包括:
#include:用于包含頭文件,將頭文件中的代碼插入到程序中。 |
#ifndef、#define、#endif:用于防止頭文件被重復(fù)包含。 |
#if、#elif、#else、#endif:用于條件編譯,根據(jù)條件決定是否編譯某段代碼。 |
#warning:用于在編譯時(shí)輸出警告信息。 |
#error:用于在編譯時(shí)輸出錯(cuò)誤信息。 |
#line:用于改變預(yù)處理器所報(bào)告的當(dāng)前文件名和行號(hào)。 |
#pragma:用于改變編譯器的特定設(shè)置。 |
這些預(yù)處理命名都是在編譯階段進(jìn)行處理的,可以用來控制編譯過程、生成特定代碼或輸出信息等。文章來源:http://www.zghlxwxcb.cn/news/detail-831816.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-831816.html
到了這里,關(guān)于程序的編譯相關(guān)操作(C語言)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!