當(dāng)前位置:首頁 > 公眾號精選 > 程序員小哈
[導(dǎo)讀]—般情況下,C語言源程序中的每一行代碼.都要參加編譯。但有時(shí)候出于對程序代碼優(yōu)化的考慮.希望只對其中一部分內(nèi)容進(jìn)行編譯.此時(shí)就需要在程序中加上條件,讓編譯器只對滿足條件的代碼進(jìn)行編譯,將不滿足條件的代碼舍棄,這就是條件編譯。

前言

????—般情況下,C語言源程序中的每一行代碼.都要參加編譯。但有時(shí)候出于對程序代碼優(yōu)化的考慮.希望只對其中一部分內(nèi)容進(jìn)行編譯.此時(shí)就需要在程序中加上條件,讓編譯器只對滿足條件的代碼進(jìn)行編譯,將不滿足條件的代碼舍棄,這就是條件編譯,相關(guān)的預(yù)編譯指令如下


#define

定義一個(gè)預(yù)處理宏

#undef

取消宏的定義

#if

編譯預(yù)處理中的條件命令,相當(dāng)于C語法中的if語句

#ifdef

判斷某個(gè)宏是否被定義,若已定義,執(zhí)行隨后的語句

#ifndef

與#ifdef相反,判斷某個(gè)宏是否未被定義

#elif

若#if, ?#ifdef, #ifndef或前面的#elif條件不滿足,則執(zhí)行#elif之后的語句,相當(dāng)于C語法中的else-if

else

與#if, ?#ifdef, #ifndef對應(yīng), 若這些條件不滿足,則執(zhí)行#else之后的語句,相當(dāng)于C語法中的else

endif

#if, #ifdef, #ifndef這些條件命令的結(jié)束標(biāo)志.

defined

與#if, ?#elif配合使用,判斷某個(gè)宏是否被定義


條件編譯功能

????預(yù)處理程序提供了條件編譯的功能。條件編譯允許只編譯源文件中滿足條件的程序 段,使生成的目標(biāo)程序較短,從而減少了內(nèi)存的開銷,并提高程序的效率,可以按不同的 條件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件,提高了程序的可移植性和靈活性


應(yīng)用舉例


#undef

可以取消宏定義,與#define對應(yīng)。


#define

#define命令定義一個(gè)宏:,按照是否帶參數(shù)通常分為對象宏、函數(shù)宏兩種。


對象宏:?不帶參數(shù)的宏被稱為"對象宏(objectlike macro)"。對象宏多用于定義常量、通用標(biāo)識。例如:

// 常量定義#define MAX_LENGTH 100// 通用標(biāo)識,日志輸出宏#define SLog printf// 預(yù)編譯宏#define _DEBUG


函數(shù)宏:帶參數(shù)的宏。利用宏可以提高代碼的運(yùn)行效率: 子程序的調(diào)用需要壓棧出棧, 這一過程如果過于頻繁會耗費(fèi)掉大量的CPU運(yùn)算資源。所以一些代碼量小但運(yùn)行頻繁的代碼如果采用帶參數(shù)宏來實(shí)現(xiàn)會提高代碼的運(yùn)行效率。但多數(shù)c++程序不推薦使用函數(shù)宏,調(diào)試上有一定難度,可考慮使用c++的inline代替之。例如:

// 最小值函數(shù)#define MIN(a,b) ((a)>(b)? (a):(b))// 安全釋放內(nèi)存函數(shù)#define SAFE_DELETE(p) {if(NULL!=p){delete p; p = NULL;}}


defined用來測試某個(gè)宏是否被定義。defined(name): 若宏被定義,則返回1,否則返回0。可用于在一條判斷語句中聲明多個(gè)判別條件,例如:

#if?defined(VAX)?&&?defined(UNIX)?&&?!defined(DEBUG)?


#ifdef、#ifndef、#else、#endif


#ifdef用于判斷某個(gè)宏是否定義,和#ifndef功能正好相反,二者僅支持判斷單個(gè)宏是否已經(jīng)定義

#ifdef ABC// ... codes while definded ABC#elif?(VERSION?>?2)// ... codes while CODE_VERSION > 2#else// ... remained cases#endif //


#ifndef ABCD_H#define?ABCD_H//?...?some?declaration?codes#endif?//?#ifndef?ABCD_H


?#if、#elif、#else、#endif


#if可支持同時(shí)判斷多個(gè)宏的存在,與常量表達(dá)式配合使用。常用格式如下:

#if 常量表達(dá)式1// ... some codes#elif 常量表達(dá)式2// ... other codes#elif 常量表達(dá)式3// ......#else// ... statement#endif

????常量表達(dá)式可以是包含宏、算術(shù)運(yùn)算、邏輯運(yùn)算等等的合法C常量表達(dá)式,如果常量表達(dá)式為一個(gè)未定義的宏, 那么它的值被視為0。


特別注意


#if 和 #ifdef的區(qū)別

????在判斷某個(gè)宏是否被定義時(shí),應(yīng)當(dāng)避免使用#if,因?yàn)樵摵甑闹悼赡芫褪潜欢x為0。而應(yīng)當(dāng)使用#ifdef或#ifndef。看兩段段代碼,哪段代碼會被編譯進(jìn)去,強(qiáng)調(diào)下是編譯進(jìn)去,不是執(zhí)行。

#define XXX 0//?第一段條件編譯#ifdef?XXX 邏輯1#else 邏輯2#endif


#define?XXX?0// 第二段條件編譯#if XXX 邏輯1#else 邏輯2#endif


  • 第一段條件編譯:邏輯1會被編譯進(jìn)去

  • 第二段條件編譯:邏輯2會被編譯進(jìn)去


區(qū)別

#if既關(guān)心宏是否定義,又關(guān)心宏的邏輯的真假

#ifdef(#if defined())、#ifndef(#if !defined())僅僅關(guān)心宏是否被定義,不關(guān)心宏的邏輯真假


#if 0 ?或 ?#if 1注釋

????當(dāng)屏蔽掉大塊代碼時(shí),使用"#if 0"比使用"/**/"要好。(因?yàn)橛?/**/"做大段的注釋時(shí),需要防止被注釋掉的代碼段中有嵌套的"/**/",一旦出現(xiàn)"/**/"嵌套"/**/"的情況,會導(dǎo)致你注釋掉的代碼區(qū)域并不是你想要的區(qū)域范圍)?

1)常見的一種,如有一段不想要的代碼,可以直接用"#if 0 ... #endif"形式來注釋,效果等同于"/**/"

#if?0????...code...#endif


2)選擇結(jié)構(gòu)的條件編譯。(如果常量為真【非0,隨便什么數(shù)字,只要不是0】,就執(zhí)行程序段1,否則執(zhí)行程序段2。)

#if?constant????...code 1...#else????...code 2...#endif


3)嵌套情況。(如果常量a為真【非0,隨便什么數(shù)字,只要不是0】,就執(zhí)行程序段1。當(dāng)常量a為0且常量b為真時(shí),執(zhí)行程序段2;當(dāng)常量a為0且常量b為0時(shí),執(zhí)行程序段3)

#if?constant a  ??...code1...#else????????#if?constant b  ????????...code 2...????????#else  ????????...code 3...  ????#endif#endif


總結(jié)

????有些程序在調(diào)試、兼容性、平臺移植等情況下可能想要通過簡單地設(shè)置一些參數(shù)就生成一個(gè)不同的軟件,這當(dāng)然可以通過變量設(shè)置,把所有可能用到的代碼都寫進(jìn)去,在初始化時(shí)配置,但在不同的情況下可能只用到一部分代碼,就沒必要把所有的代碼都寫進(jìn)去,就可以用條件編譯,條件編譯是為了讓程序在各種不同的軟硬件環(huán)境下都以運(yùn)行,提高其可移植性。


推薦閱讀


(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

Qt 學(xué)習(xí)筆記-強(qiáng)勢入門

Qt 學(xué)習(xí)筆記-Qt中添加背景圖片的方法

Qt 學(xué)習(xí)筆記-處理鼠標(biāo)響應(yīng)事件

Qt 純屬娛樂-繪制一個(gè)模擬時(shí)鐘

C++小游戲:撲克牌21點(diǎn)

const 指針與指向const的指針

hello world 程序是如何被編譯出來的?

C語言main函數(shù)有哪些寫法呢

【編程之美】用C語言實(shí)現(xiàn)狀態(tài)機(jī)(實(shí)用)

【超詳細(xì)C語言】帶你吃透貪吃蛇游戲之精髓

程序員視角看手機(jī)計(jì)算器上為什么10%+10% != 0.2 ?


關(guān)注公眾號【技術(shù)讓夢想更偉大】,獲取更多Linux/C/C++/Python/FPGA等原創(chuàng)技術(shù)文章。后臺免費(fèi)獲取經(jīng)典電子書籍和視頻資源,實(shí)時(shí)更新,原創(chuàng)不易,請多支持,謝謝!

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉