C/C++編程筆記:C / C ++預(yù)處理器,帶你更好地學(xué)習(xí)C++程序


顧名思義,預(yù)處理器是在編譯之前處理我們的源代碼的程序。在C / C ++中編寫(xiě)程序和執(zhí)行程序之間涉及許多步驟。在實(shí)際開(kāi)始學(xué)習(xí)預(yù)處理器之前,讓我們看一下這些步驟。

您可以在上圖中看到中間步驟。程序員編寫(xiě)的源代碼存儲(chǔ)在文件program.c中。然后,該文件由預(yù)處理器處理,并生成名為程序的擴(kuò)展源代碼文件。該擴(kuò)展文件由編譯器編譯,并生成一個(gè)名為program .obj的目標(biāo)代碼文件。最后,鏈接器將此目標(biāo)代碼文件鏈接到庫(kù)函數(shù)的目標(biāo)代碼,以生成可執(zhí)行文件program.exe。?
預(yù)處理程序提供預(yù)處理程序指令,這些指令告訴編譯器在編譯之前對(duì)源代碼進(jìn)行預(yù)處理。所有這些預(yù)處理程序指令均以“?!保ü#┓?hào)開(kāi)頭?!埃!狈?hào)表示無(wú)論以#開(kāi)頭的任何語(yǔ)句都將進(jìn)入預(yù)處理程序,并且預(yù)處理程序?qū)?zhí)行此語(yǔ)句。一些預(yù)處理器指令的實(shí)例為:#包括,#定義,的#ifndef等記住,#符號(hào)僅提供其將去到預(yù)處理器的路徑,并且命令例如包括由預(yù)處理器程序處理。例如,include將在程序中包含額外的代碼。我們可以將這些預(yù)處理程序指令放置在程序中的任何位置。?
預(yù)處理器指令有4種主要類(lèi)型:
宏
文件包含
條件編譯
其他指令
現(xiàn)在讓我們?cè)敿?xì)了解這些指令中的每一個(gè)。?
宏:宏是程序中的一段代碼,具有一定的名稱(chēng)。只要編譯器遇到此名稱(chēng),編譯器就會(huì)用實(shí)際的代碼片段替換該名稱(chēng)。“ #define”指令用于定義宏?,F(xiàn)在讓我們借助程序來(lái)了解宏定義:?
C++:

C語(yǔ)言:

在上述程序中,編譯器執(zhí)行LIMIT時(shí),將其替換為5。宏定義中的LIMIT被稱(chēng)為宏模板,而5則是宏擴(kuò)展。?
注意:宏定義的末尾沒(méi)有分號(hào)(';')。宏定義不需要以分號(hào)結(jié)尾。
帶參數(shù)的宏:我們還可以將參數(shù)傳遞給宏。用參數(shù)定義的宏的作用類(lèi)似于函數(shù)。讓我們通過(guò)一個(gè)程序來(lái)理解這一點(diǎn):?
C++:

C語(yǔ)言:

從上面的程序我們可以看到,每當(dāng)編譯器在程序中找到AREA(l,b)時(shí),它將用語(yǔ)句(l * b)替換它。不僅如此,傳遞給宏模板AREA(l,b)的值還將在語(yǔ)句(l * b)中替換。因此,AREA(10,5)等于10 * 5。?
文件包含:這種類(lèi)型的預(yù)處理程序指令告訴編譯器在源代碼程序中包含文件。用戶(hù)可以在程序中包括兩種類(lèi)型的文件:?
頭文件或標(biāo)準(zhǔn)文件:這些文件包含預(yù)定義函數(shù)的定義,例如printf(),scanf()等。必須包含這些文件才能使用這些函數(shù)。在不同的頭文件中聲明了不同的功能。例如,標(biāo)準(zhǔn)I / O功能在“ iostream”文件中,而執(zhí)行字符串操作的功能在“ string”文件中。?
語(yǔ)法:?
#include< file_name >
其中file_name是要包含的文件的名稱(chēng)。“ <”和“>”括號(hào)告訴編譯器在標(biāo)準(zhǔn)目錄中查找文件。?
用戶(hù)定義的文件:當(dāng)程序變得很大時(shí),將其分成較小的文件并在需要時(shí)包含它是一個(gè)很好的實(shí)踐。這些類(lèi)型的文件是用戶(hù)定義的文件。這些文件可以包括為:?
#include"filename"
條件編譯:條件編譯指令是指令的類(lèi)型,可幫助根據(jù)某些條件編譯程序的特定部分或跳過(guò)程序某些特定部分的編譯。這可以借助兩個(gè)預(yù)處理命令“?ifdef?”和“?endif?”來(lái)完成。
語(yǔ)法:?
#ifdef macro_name? ??
聲明1;? ??
聲明2;? ??
statement3;?
.....
statementN;
#endif
如果定義了名稱(chēng)為“?macroname?”的宏,則該語(yǔ)句塊將正常執(zhí)行,但如果未定義,則編譯器將直接跳過(guò)該語(yǔ)句塊。?
其他指令:除了上述指令外,還有另外兩個(gè)不常用的指令。這些是:?
#undef指令:#undef指令用于取消定義現(xiàn)有宏。該指令的工作方式為:?
#undef LIMIT
使用此語(yǔ)句將取消定義現(xiàn)有的宏LIMIT。在此語(yǔ)句之后,每個(gè)“ #ifdef LIMIT”語(yǔ)句將評(píng)估為false。?
#pragma指令:此指令是一種特殊用途的指令,用于打開(kāi)或關(guān)閉某些功能。這類(lèi)指令是特定于編譯器的,即,它們因編譯器而異。下面討論了一些#pragma指令:?
#pragma startup和#pragma exit:這些指令可幫助我們指定程序啟動(dòng)之前(控件傳遞到main()之前)和程序退出之前(控件從main()返回之前)所需運(yùn)行的功能。 。?
注意:以下程序不適用于GCC編譯器。?
看下面的程序:
C++:

C語(yǔ)言:

當(dāng)在GCC編譯器上運(yùn)行時(shí),以上代碼將產(chǎn)生如下輸出:?
Inside?main()
發(fā)生這種情況是因?yàn)镚CC不支持#pragma啟動(dòng)或退出。但是,您可以將以下代碼用于GCC編譯器上的類(lèi)似輸出。?
C語(yǔ)言:

#pragma warn指令:該指令用于隱藏在編譯過(guò)程中顯示的警告消息。?
我們可以隱藏警告,如下所示:?
#pragma warn -rvl:該指令隱藏應(yīng)該在應(yīng)返回值的函數(shù)不返回值時(shí)引發(fā)的警告。
#pragma warn -par:該指令隱藏了當(dāng)函數(shù)不使用傳遞給它的參數(shù)時(shí)引發(fā)的警告。
#pragma warn -rch:此偽指令隱藏在無(wú)法訪問(wèn)代碼時(shí)發(fā)出的警告。例如:在函數(shù)的return語(yǔ)句之后編寫(xiě)的任何代碼均不可訪問(wèn)。
希望對(duì)大家有幫助~
另外如果你想更好的提升你的編程能力,學(xué)好C語(yǔ)言C++編程!彎道超車(chē),快人一步!筆者這里或許可以幫到你~

UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~
分享(源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
編程學(xué)習(xí)書(shū)籍分享:

編程學(xué)習(xí)視頻分享:
