在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

C語言中常見預(yù)編譯指令的靈活秒用

strongerHuang ? 來源:技術(shù)讓夢(mèng)想更偉大 ? 作者:技術(shù)讓夢(mèng)想更偉大 ? 2021-04-27 11:18 ? 次閱讀

有時(shí)候出于對(duì)程序代碼優(yōu)化的考慮。希望只對(duì)其中一部分內(nèi)容進(jìn)行編譯。此時(shí)就需要在程序中加上條件,讓編譯器只對(duì)滿足條件的代碼進(jìn)行編譯,將不滿足條件的代碼舍棄,這就是條件編譯。

常見的預(yù)編譯指令如下:

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

2.應(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用來測(cè)試某個(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。

3.特別注意

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

在判斷某個(gè)宏是否被定義時(shí),應(yīng)當(dāng)避免使用#if,因?yàn)樵摵甑闹悼赡芫褪潜欢x為0。而應(yīng)當(dāng)使用#ifdef或#ifndef。看兩段段代碼,哪段代碼會(huì)被編譯進(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會(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”形式來注釋,效果等同于“/**/”

#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

4.總結(jié)

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

原文標(biāo)題:C 語言#if、#elif、#ifdef的靈活秒用

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

責(zé)任編輯:haq

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

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140758

原文標(biāo)題:C 語言#if、#elif、#ifdef的靈活秒用

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    提高篇——C語言核心技術(shù)(中文版)

    嚴(yán)謹(jǐn)?shù)男g(shù)語表介紹C語言;第二部分描述標(biāo)準(zhǔn)鏈接庫;第三部分介紹GNU軟件包中常用的編譯和測(cè)試工具。 獲取完整文檔資料可下載附件哦!!!!如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持一下哦~
    發(fā)表于 06-13 16:39

    深入理解C語言C語言循環(huán)控制

    改變程序的執(zhí)行流程,使代碼更加靈活和可控。本文將詳細(xì)介紹這些語句的作用及其應(yīng)用場(chǎng)景,并通過示例代碼進(jìn)行說明。Part.1break語句C語言中break語句有兩種
    的頭像 發(fā)表于 04-29 18:49 ?965次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>C</b><b class='flag-5'>語言</b>循環(huán)控制

    棱鏡——機(jī)器視覺系統(tǒng)中常見的重要配件

    棱鏡——機(jī)器視覺系統(tǒng)中常見的重要配件
    的頭像 發(fā)表于 01-15 17:36 ?488次閱讀
    棱鏡——機(jī)器視覺系統(tǒng)<b class='flag-5'>中常見</b>的重要配件

    EE-62:在C語言中訪問短字內(nèi)存

    電子發(fā)燒友網(wǎng)站提供《EE-62:在C語言中訪問短字內(nèi)存.pdf》資料免費(fèi)下載
    發(fā)表于 01-07 14:02 ?0次下載
    EE-62:在<b class='flag-5'>C</b><b class='flag-5'>語言中</b>訪問短字內(nèi)存

    EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù).pdf》資料免費(fèi)下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的DSP:從<b class='flag-5'>C</b>調(diào)用匯編類成員函數(shù)

    Triton編譯器支持的編程語言

    Triton編譯器支持的編程語言主要包括以下幾種: 一、主要編程語言 Python :Triton編譯器通過Python接口提供了對(duì)Triton語言
    的頭像 發(fā)表于 12-24 17:33 ?906次閱讀

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個(gè)開源的編譯器前端,它支持多種編程語言,包括 CC++、Fortran 和 Ada。Triton 旨在提供一個(gè)可擴(kuò)展和可定制的
    的頭像 發(fā)表于 12-24 17:23 ?1581次閱讀

    C語言中申請(qǐng)的堆內(nèi)存能不能自動(dòng)釋放

    C語言中申請(qǐng)的堆內(nèi)存能不能自動(dòng)釋放?每次都要手動(dòng) free 太麻煩,也容易忘記。 學(xué)過 C++ 的同學(xué),應(yīng)該首先能想到智能指針。 但是這是C語言
    的頭像 發(fā)表于 11-27 09:33 ?488次閱讀

    C語言中的頭文件能不能重復(fù)包含

    C語言中的頭文件能不能重復(fù)包含? 比如代碼寫成這樣,stdio.h 連續(xù)包含了兩次。 #include #include int main(){ printf("helloworld
    的頭像 發(fā)表于 11-26 17:19 ?539次閱讀

    C語言關(guān)鍵字分別發(fā)生在哪個(gè)階段

    以下C語言關(guān)鍵字,分別發(fā)生在哪個(gè)階段? 第一個(gè),define。 首先得糾正一下,define 并不是C語言里面的關(guān)鍵字,即使加了井號(hào),也不是。 define 屬于
    的頭像 發(fā)表于 11-24 10:31 ?549次閱讀

    技術(shù)干貨驛站 ▏深入理解C語言:掌握C語言條件判斷,從if到switch的應(yīng)用

    語句和條件運(yùn)算符。這些結(jié)構(gòu)不僅增強(qiáng)了代碼的靈活性,還提高了程序的可讀性和可維護(hù)性。本文將深入探討C語言中的主要條件判斷語句,包括它們的語法、使用方法及實(shí)際應(yīng)用,通過
    的頭像 發(fā)表于 11-09 01:10 ?818次閱讀
    技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:掌握<b class='flag-5'>C</b><b class='flag-5'>語言</b>條件判斷,從if到switch的應(yīng)用

    C語言中的socket編程基礎(chǔ)

    Socket編程簡(jiǎn)介 Socket是一種通信機(jī)制,允許程序之間進(jìn)行通信。在C語言中,socket編程是網(wǎng)絡(luò)編程的基礎(chǔ)。通過使用socket,程序可以發(fā)送和接收數(shù)據(jù),實(shí)現(xiàn)不同計(jì)算機(jī)之間的通信
    的頭像 發(fā)表于 11-01 16:51 ?1112次閱讀

    C語言中最常見的宏定義寫法

    如果讓你C語言寫個(gè)宏定義,我相信大部分同學(xué)順手就能寫出define。
    的頭像 發(fā)表于 10-28 11:12 ?780次閱讀

    hex文件如何查看原c語言代碼

    直接將 .hex 文件轉(zhuǎn)換回原始的 C 語言代碼是不可能的,因?yàn)?.hex 文件是二進(jìn)制文件,它包含了單片機(jī)程序編譯后的機(jī)器碼,這些機(jī)器碼與原始的 C
    的頭像 發(fā)表于 09-02 10:37 ?4635次閱讀

    c語言中從左到右結(jié)合怎么看

    C語言中,操作符的結(jié)合性(Associativity)是指當(dāng)操作符在表達(dá)式中連續(xù)出現(xiàn)時(shí),它們?nèi)绾闻c操作數(shù)結(jié)合的順序。對(duì)于大多數(shù)二元操作符(即需要兩個(gè)操作數(shù)的操作符),C語言遵循兩種基
    的頭像 發(fā)表于 08-20 11:42 ?1545次閱讀
    主站蜘蛛池模板: 欧美黄一片 | 国产a一级毛片午夜剧场14 | 国产免费资源 | 国产老肥熟xxxx | 国产一级片免费 | 日本黄色小说视频 | 男男h文小说阅 | 欧美性生交xxxxx久久久 | 你懂的在线观看视频 | 天天爽天天| 成人免费看黄网站无遮挡 | 在线成人精品国产区免费 | 天天干天天色天天干 | 热久久这里只有精品 | 一区二区三区视频观看 | 日本巨黄视频 | 四虎影院精品在线观看 | 日本内谢69xxxx免费 | 日本加勒比黑人 | 亚洲天天做日日做天天欢毛片 | 99热最新网址 | 婷婷 色天使| 日本高清色视频www 日本高清色视频在线观看免费 | 美女免费观看一区二区三区 | 亚洲综合色婷婷 | 男子扒开美女尿口做羞羞的事 | 日本在线不卡一区二区 | 免费看男女做好爽好硬视频 | 日本高清午夜色wwwσ | 狠狠色噜噜狠狠狠狠狠色综合久久 | 天堂在线www网亚洲 天堂在线观看 | 亚洲插插插 | 一个色在线视频 | 毛片在线播放网站 | 天天做天天摸天天爽天天爱 | 久久久久久久久久免免费精品 | www.4hu影院| 欧美a∨| 国产欧美日韩在线人成aaaa | 亚洲视频 欧美视频 | 男女爱爱免费 |