日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

前言

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


#define

定義一個預處理宏

#undef

取消宏的定義

#if

編譯預處理中的條件命令,相當于C語法中的if語句

#ifdef

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

#ifndef

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

#elif

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

else

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

endif

#if, #ifdef, #ifndef這些條件命令的結束標志.

defined

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


條件編譯功能

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


應用舉例


#undef

可以取消宏定義,與#define對應。


#define

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


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

// 常量定義#define MAX_LENGTH 100// 通用標識,日志輸出宏#define SLog printf// 預編譯宏#define _DEBUG


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

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


defined用來測試某個宏是否被定義。defined(name): 若宏被定義,則返回1,否則返回0??捎糜谠谝粭l判斷語句中聲明多個判別條件,例如:

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


#ifdef、#ifndef、#else、#endif


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

#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可支持同時判斷多個宏的存在,與常量表達式配合使用。常用格式如下:

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

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


特別注意


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

????在判斷某個宏是否被定義時,應當避免使用#if,因為該宏的值可能就是被定義為0。而應當使用#ifdef或#ifndef。看兩段段代碼,哪段代碼會被編譯進去,強調下是編譯進去,不是執(zhí)行。

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


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


  • 第一段條件編譯:邏輯1會被編譯進去

  • 第二段條件編譯:邏輯2會被編譯進去


區(qū)別

#if既關心宏是否定義,又關心宏的邏輯的真假

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


#if 0 ?或 ?#if 1注釋

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

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

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


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

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


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

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


總結

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


推薦閱讀


(點擊標題可跳轉閱讀)

Qt 學習筆記-強勢入門

Qt 學習筆記-Qt中添加背景圖片的方法

Qt 學習筆記-處理鼠標響應事件

Qt 純屬娛樂-繪制一個模擬時鐘

C++小游戲:撲克牌21點

const 指針與指向const的指針

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

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

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

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

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


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

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

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

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉