0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言中條件編譯詳解

Q4MP_gh_c472c21 ? 來源:技術(shù)讓夢(mèng)想更偉大 ? 作者:技術(shù)讓夢(mèng)想更偉大 ? 2022-04-14 13:12 ? 次閱讀

前言

—般情況下,C語言源程序中的每一行代碼.都要參加編譯。但有時(shí)候出于對(duì)程序代碼優(yōu)化的考慮,希望只對(duì)其中一部分內(nèi)容進(jìn)行編譯。此時(shí)就需要在程序中加上條件,讓編譯器只對(duì)滿足條件的代碼進(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對(duì)應(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對(duì)應(yīng)。

#define

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

對(duì)象宏

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

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

函數(shù)宏

帶參數(shù)的宏。利用宏可以提高代碼的運(yùn)行效率:子程序的調(diào)用需要壓棧出棧,這一過程如果過于頻繁會(huì)耗費(fèi)掉大量的CPU運(yùn)算資源。所以一些代碼量小但運(yùn)行頻繁的代碼如果采用帶參數(shù)宏來實(shí)現(xiàn)會(huì)提高代碼的運(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??捎糜谠谝粭l判斷語句中聲明多個(gè)判別條件,例如:

#ifdefined(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#defineABCD_H//...somedeclarationcodes#endif//#ifndefABCD_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??磧啥味未a,哪段代碼會(huì)被編譯進(jìn)去,強(qiáng)調(diào)下是編譯進(jìn)去,不是執(zhí)行。

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

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

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

  • 第二段條件編譯:邏輯2會(huì)被編譯進(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)"/**/"嵌套"/**/"的情況,會(huì)導(dǎo)致你注釋掉的代碼區(qū)域并不是你想要的區(qū)域范圍) 。

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

#if0...code...#endif

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

#ifconstant...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)

#ifconstant a...code1...#else#ifconstant b...code 2...#else...code 3...#endif#endif

總結(jié)

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

原文標(biāo)題:C/C++中條件編譯#if、#elif、#ifdef等靈活秒用

文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136820
  • 源程序
    +關(guān)注

    關(guān)注

    63

    文章

    1693

    瀏覽量

    45490
  • 條件編譯
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    5494

原文標(biāo)題:C/C++中條件編譯#if、#elif、#ifdef等靈活秒用

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式C語言中的goto語句詳解

    goto語句被稱為C語言中的跳轉(zhuǎn)語句。用于無條件跳轉(zhuǎn)到其他標(biāo)簽。它將控制權(quán)轉(zhuǎn)移到程序的其他部分。
    發(fā)表于 07-19 16:08 ?3383次閱讀
    嵌入式<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的goto語句<b class='flag-5'>詳解</b>

    C語言中預(yù)定義宏的用法和使用場景

    C語言中,預(yù)定義宏是由編譯器提供的一組特殊標(biāo)識(shí)符,可以在程序中直接使用,無需進(jìn)行額外的定義。
    發(fā)表于 08-16 16:12 ?481次閱讀

    C語言中for循環(huán)的用法和應(yīng)用 C語言中for循環(huán)與while循環(huán)的區(qū)別

    C語言中的循環(huán)結(jié)構(gòu)時(shí),for循環(huán)是最常用的一種。它允許重復(fù)執(zhí)行一段代碼,直到滿足特定條件為止。
    發(fā)表于 08-18 16:33 ?3257次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>for循環(huán)的用法和應(yīng)用 <b class='flag-5'>C</b><b class='flag-5'>語言中</b>for循環(huán)與while循環(huán)的區(qū)別

    C語言中if語句、if-else語句和switch語句詳解

    C語言中,有三種條件判斷結(jié)構(gòu):if語句、if-else語句和switch語句。
    發(fā)表于 08-18 16:36 ?1.2w次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>if語句、if-else語句和switch語句<b class='flag-5'>詳解</b>

    C語言中賦值運(yùn)算符詳解

    C語言中,賦值運(yùn)算符用于將一個(gè)值賦給變量。
    發(fā)表于 08-18 16:38 ?2014次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>賦值運(yùn)算符<b class='flag-5'>詳解</b>

    C語言中條件編譯的妙用

    線。我對(duì)學(xué)習(xí)總結(jié)出一句話“壓力不是有人努力,而是比你牛X N倍的人依然在努力” C語言中條件編譯的應(yīng)用 一般情況下,源程序中所有的行都要參加編譯
    發(fā)表于 07-19 01:53

    如何在C語言滿足多個(gè)條件下進(jìn)行條件編譯?

    請(qǐng)教一下各位。在C語言中如果滿足多個(gè)宏定義條件怎么來進(jìn)行條件編譯呢?今天在寫I2C總線操作的時(shí)候
    發(fā)表于 11-08 04:35

    C語言中指針的介紹非常詳細(xì)

    C語言中指針的介紹非常詳細(xì) C語言中指針的介紹非常詳細(xì)
    發(fā)表于 12-25 10:39 ?57次下載

    C語言中的關(guān)鍵字

    C語言中的入門教程
    發(fā)表于 10-14 16:24 ?3次下載

    c語言中typedef的用法

    C語言是一門通用計(jì)算機(jī)編程語言,應(yīng)用廣泛。C語言的設(shè)計(jì)目標(biāo)是提供一種能以簡易的方式編譯、處理低級(jí)
    發(fā)表于 11-09 15:23 ?9232次閱讀

    c語言條件編譯技巧與示例分析

    C語言條件編譯#if, #elif, #else, #endif、#ifdef, #ifndef 有些程序在調(diào)試、兼容性、平臺(tái)移植等情況下可能想要通過簡單地設(shè)置一些參數(shù)就生成一個(gè)不同
    的頭像 發(fā)表于 08-26 15:06 ?2753次閱讀

    EE-88:使用21xx編譯器初始化C語言中的變量

    EE-88:使用21xx編譯器初始化C語言中的變量
    發(fā)表于 05-19 21:08 ?1次下載
    EE-88:使用21xx<b class='flag-5'>編譯</b>器初始化<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的變量

    C語言條件編譯語句and單片機(jī)DMA的介紹

    C語言條件編譯語句and單片機(jī)DMA的介紹C語言條件
    發(fā)表于 11-29 10:36 ?3次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>條件</b><b class='flag-5'>編譯</b>語句and單片機(jī)DMA的介紹

    在標(biāo)準(zhǔn)C語言中編譯出來的可執(zhí)行程序

    在標(biāo)準(zhǔn)C語言中,編譯出來的可執(zhí)行程序分為代碼區(qū)(text)、數(shù)據(jù)區(qū)(data)和未初始化數(shù)據(jù)區(qū)(bss)3個(gè)部分。如下代碼
    的頭像 發(fā)表于 06-16 09:01 ?1895次閱讀
    在標(biāo)準(zhǔn)<b class='flag-5'>C</b><b class='flag-5'>語言中</b><b class='flag-5'>編譯</b>出來的可執(zhí)行程序

    c語言中邏輯真等價(jià)于什么

    C語言中,邏輯真等價(jià)于1。邏輯真可以理解為一個(gè)表達(dá)式、語句或條件的結(jié)果為真,即滿足條件。在計(jì)算機(jī)科學(xué)和編程中,邏輯真在控制流語句、循環(huán)和條件
    的頭像 發(fā)表于 11-30 14:10 ?2189次閱讀