預(yù)處理指令用法詳解(C語(yǔ)言)-天天快播報(bào)
前言
使編譯器執(zhí)行預(yù)處理操作的代碼被稱(chēng)為預(yù)處理指令,本文介紹常見(jiàn)的預(yù)處理指令的實(shí)際用法。
(資料圖片)
一、預(yù)處理符號(hào)
預(yù)處理符號(hào)是C語(yǔ)言?xún)?nèi)置的符號(hào),是可以直接使用的。
其中,若遵頊ANSI C,則__STDC__
為1,否則未定義。
二、#define
1)定義標(biāo)識(shí)符
#define可以用來(lái)定義標(biāo)識(shí)符,其語(yǔ)法為:#define name stuff
,經(jīng)過(guò)預(yù)處理后,stuff
會(huì)被直接替換為·name
。
若stuff
的內(nèi)若過(guò)長(zhǎng),可在句末加上\
續(xù)行符號(hào),像這樣:
#include#define Piccaso "Pablo,Diego,José\Francisco,de,Paula,Juan,Nepomuceno\,María,de,los,Remedios,Cipriano,de\,la,Santísima,Trinidad,Ruiz,y,Picasso"int main(){printf("%s", Piccaso);return 0;}
示例1:數(shù)值替換
int main(){int a = 100;return 0;}
示例2:循環(huán)替換
#includeint main(){while(1){printf("A");}return 0;}
運(yùn)行代碼,將會(huì)在屏幕上死循環(huán)地打印A
。
示例3:分支替換
int main(){int input = 0;switch (input){case 1:break; case 2:break; case 3:}return 0;}
2)宏定義
#define允許有參數(shù)的文本替換,這種操作通常稱(chēng)為宏,其語(yǔ)法為:#define name(list) stuff
,其中,list
是由逗號(hào)隔開(kāi)的符號(hào)表,符號(hào)有可能出現(xiàn)在stuff
中。
示例1:
int main(){printf("%d", 5+5);return 0;}
示例2:
int main(){printf("%d", 10*double(5+1));return 0;}
因?yàn)?code>#define的功能只是替換,若要利用宏定義實(shí)現(xiàn)快捷的函數(shù)操作,最好的方法是在宏定義時(shí)多加括號(hào),以便于達(dá)到整體求值的效果,像這樣:#define double(x) (x)+(x)
。
注意:由于宏是直接替換,因此傳參時(shí)嚴(yán)禁使用自增,自減,傳參時(shí)使用,替換后依然會(huì)再次執(zhí)行,會(huì)導(dǎo)致不可預(yù)測(cè)的后果。
3)字符串轉(zhuǎn)換符
字符串有自動(dòng)連接的特點(diǎn),例如運(yùn)行以下這段代碼:
#includeint main(){printf("123" "456");return 0;}
效果圖:
字符串轉(zhuǎn)換符#就是利用這個(gè)特性,它可以將宏定義中傳入的參數(shù),替換為字符串格式。
#include#define sum(x) printf("the val of "#x" is %d",x)int main(){int a = 10;sum(a);return 0;}
在上述代碼中,#號(hào)
將a
直接轉(zhuǎn)化為字符串,隨后三個(gè)字符串拼接在一起。
效果圖:
利用該方法可以只傳參一次實(shí)現(xiàn)值和名
同時(shí)打印。
4)片段鏈接符
在宏定義時(shí),片段連接符##
可以實(shí)現(xiàn)將兩個(gè)符號(hào)連接在一起,使其成為一個(gè)符號(hào),前提是這個(gè)合成的符號(hào)必須已經(jīng)被定義。
#include#define double(x) sum##x*=2int main(){int sum1 = 1;int sum2 = 1;int sum3 = 1;double(1);printf("%d %d %d", sum1, sum2, sum3);return 0;}
在上述代碼中,##
會(huì)把sum和參數(shù)x連接在一起,當(dāng)我們傳入1經(jīng)過(guò)預(yù)處理后,等效于:sum1*=2
。
效果圖:
5)宏定義VS函數(shù)
宏定義的優(yōu)勢(shì):
宏定義的執(zhí)行速度遠(yuǎn)遠(yuǎn)超過(guò)函數(shù),當(dāng)執(zhí)行簡(jiǎn)單的計(jì)算時(shí),更適合使用宏定義。宏定義傳參時(shí)沒(méi)有類(lèi)型檢測(cè),可以將任意的數(shù)據(jù)傳入。宏定義是直接替換,可以傳入各種各樣的符號(hào),實(shí)現(xiàn)許許多多函數(shù)做不到的功能。(可以傳入類(lèi)型、傳入函數(shù)、傳入語(yǔ)句等等)宏定義的劣勢(shì):
宏定義不能調(diào)試、不能遞歸,因此宏定義只適合做簡(jiǎn)單的計(jì)算。宏定義是直接替換,因此相鄰操作符的優(yōu)先級(jí)很有可能產(chǎn)生不期望的順序,因此要盡可能帶括號(hào)。宏定義傳參沒(méi)有類(lèi)型檢測(cè),因此不夠嚴(yán)謹(jǐn)。6)命名公約
以下幾條公約,必須遵守
宏定義的名必須全部大寫(xiě)。函數(shù)名不可以全部大寫(xiě)。三、#undef#undef
宏定義刪除,可以在函數(shù)內(nèi)部使用!被刪除后的標(biāo)識(shí)就不能再使用了。
四、命令行編譯
指在VScode
或Linux
等用命令行執(zhí)行編譯的環(huán)境下,可以在編譯時(shí)對(duì)變量進(jìn)行賦值。
五、條件編譯
在寫(xiě)程序時(shí),有些代碼是為了查看某個(gè)部分是否正確而寫(xiě)的的調(diào)試代碼。
刪除很可惜,但又不想讓其編譯,此時(shí)就可以使用選擇性編譯
。
但實(shí)質(zhì)上使用if
語(yǔ)句或直接注釋
會(huì)更加方便,但在C語(yǔ)言?xún)?nèi)置的頭文件中,為了節(jié)約時(shí)間經(jīng)常使用條件編譯。
1)常量表達(dá)式判斷
#if 常量表達(dá)式//...#endif
常量表達(dá)式為真,則中間的語(yǔ)句編譯;
常量表達(dá)式為假,則中間的語(yǔ)句不編譯。
此外,也可以寫(xiě)成多分支的表達(dá)式條件編譯。
int main(){#if 0printf("111");#elif 1printf("222");#else 0printf("333");#endifreturn 0;}
效果圖:
2)是否定義判斷
判斷某個(gè)符號(hào)是否被定義,只要被定義,就編譯中間的語(yǔ)句,無(wú)論其被定義為什么。
#include#define MAXint main(){#if defined(MAX)//或#ifdef MAXprintf("111");#endifreturn 0;}
或判斷某個(gè)符號(hào)是否沒(méi)定義,沒(méi)定義則編譯。
#include#define MAXint main(){#if !defined(MAX)//或#ifndef MAXprintf("111");#endifreturn 0;}
3)嵌套判斷
條件編譯是可以互相嵌套的。
#include#define DEBUG int main(){#ifdef DEBUG#if 1printf("111");#elif 0printf("222");#endif#endif return 0;}
如上述代碼是在是否定義判斷中嵌套常量表達(dá)式判斷。
效果圖:
六、頭文件的包含
1)雙引號(hào)與尖括號(hào)
對(duì)于#include
來(lái)說(shuō),后面的文件有兩種引用方法:
所有的頭文件在包含時(shí)都可以使用雙引號(hào),但為了速度和區(qū)別位置,建議自己寫(xiě)的頭文件用雙引號(hào),標(biāo)準(zhǔn)庫(kù)中的用尖括號(hào)。
2)頭文件的嵌套包含
可以將許許多多的頭文件都包含在一個(gè)自己創(chuàng)建的頭文件中,最后只需要在其他的源文件中包含該自己創(chuàng)建的頭文件即可,像這樣:
3)頭文件重復(fù)包含解決方法
在寫(xiě)多人合作的大型項(xiàng)目時(shí),每個(gè)程序員可能都要包含一次公用的頭文件,當(dāng)他們寫(xiě)的代碼匯總時(shí),這個(gè)頭文件可能會(huì)被包含多次。
因此,我們使用條件編譯來(lái)解決這個(gè)問(wèn)題。
#if !defined(TIME)#define TIME //...//... //在這里實(shí)現(xiàn)各種函數(shù)//...#endif
假設(shè)上述代碼為head.h
,當(dāng)我們第一次包含head.h
時(shí),由于TIME沒(méi)有被定義,因此會(huì)定義一個(gè)TIME,同時(shí)編譯里面的函數(shù)。
當(dāng)我們第二次包含head.h
時(shí),因?yàn)門(mén)IME被定義過(guò)了,即使head.h
里面的內(nèi)容被拷貝到源文件中,也不會(huì)進(jìn)行編譯,從而加快了速度。
注意:在頭文件開(kāi)頭加入#pragma once
即可一鍵實(shí)現(xiàn)上述效果,不必冗雜的代碼,但僅限于自己寫(xiě)的頭文件,標(biāo)準(zhǔn)庫(kù)的頭文件已經(jīng)幫你加完了。
感謝您的閱讀與耐心~
標(biāo)簽: 編程算法
原標(biāo)題:預(yù)處理指令用法詳解(C語(yǔ)言)-天天快播報(bào)
- 預(yù)處理指令用法詳解(C語(yǔ)言)-天天快播報(bào)
- 環(huán)比和同比的區(qū)別是什么?與上一年對(duì)比叫環(huán)比嗎?
- Meta“效率之年”并不高效:裁員傳聞導(dǎo)致規(guī)劃和目標(biāo)混亂-當(dāng)前聚焦
- 報(bào)告:超8成受訪(fǎng)者認(rèn)為游戲促進(jìn)AI發(fā)展
- 2023年2月13日上期所部分品種“倉(cāng)單日?qǐng)?bào)”-熱點(diǎn)在線(xiàn)
- 被《王國(guó)之淚》致敬?有游戲表示早就做出了組裝載具-世界看點(diǎn)
- 為抵制《霍格沃茨》 LGBTQ+創(chuàng)作者發(fā)布游戲捆綁包-當(dāng)前熱聞
- 信用卡和儲(chǔ)蓄卡的區(qū)別是什么?公務(wù)卡可以個(gè)人消費(fèi)嗎?
- 信用卡可以取現(xiàn)金嗎?信用卡能轉(zhuǎn)賬到微信嗎?
- 優(yōu)雅女人的衣櫥中怎能少了一席長(zhǎng)裙,保暖時(shí)髦一手抓,明星都愛(ài)了-天天新動(dòng)態(tài)
- 三歲以下嬰幼兒照護(hù)費(fèi)用專(zhuān)項(xiàng)扣除什么意思?怎么選扣除方式?
- 定期存款三大忌有哪些?老人存錢(qián)最好的方法有哪些?
- 個(gè)人養(yǎng)老金賬戶(hù)是什么意思?養(yǎng)老金個(gè)人賬戶(hù)余額能取出來(lái)嗎?
- 老鳳祥黃金價(jià)格今天多少錢(qián)一克?老鳳祥金鐲子價(jià)格表
- 南京部分取餐柜試水向騎手收費(fèi) 你怎么看呢?
- 2023年麒麟電池概念股有哪些?麒麟電池龍頭股有哪些?
- 國(guó)內(nèi)首個(gè)百兆瓦級(jí)液冷儲(chǔ)能項(xiàng)目,科華數(shù)能液冷儲(chǔ)能系統(tǒng)應(yīng)用標(biāo)桿!-每日時(shí)訊
- 最近為什么市場(chǎng)上時(shí)長(zhǎng)4小時(shí)的電池儲(chǔ)能電站越來(lái)越多?-天天信息
- 儲(chǔ)能產(chǎn)業(yè)鏈五大趨勢(shì)研判-全球熱頭條
- 走進(jìn)虛擬電廠——技術(shù)篇
- 灰氫之后是綠氫-世界速讀
- Horizon Investments首席投資官Scott Ladner稱(chēng),美國(guó)1月及未來(lái)幾個(gè)月的通脹數(shù)據(jù)...
- 科技企業(yè)競(jìng)跑ChatGPT賽道 多領(lǐng)域智慧應(yīng)用可期
- 開(kāi)普云:公司數(shù)字人已與OpenAI的GPT3-003接口完成對(duì)接-全球最資訊
- 社區(qū)團(tuán)購(gòu)末路:團(tuán)長(zhǎng)累了,經(jīng)銷(xiāo)商跑了
- 大作難產(chǎn)、項(xiàng)目被砍,育碧怕不是快寄了?-每日看點(diǎn)
- 不買(mǎi)房、不買(mǎi)股推升居民存款大增?中金:關(guān)于“超額存款”存在三個(gè)誤區(qū)
- 北約網(wǎng)站遭黑客攻擊 包括“北約特種作戰(zhàn)司令部”網(wǎng)站
- 《塞爾達(dá)傳說(shuō)王國(guó)之淚》林克和大師劍設(shè)定圖公開(kāi)-世界今日訊
- 2000多個(gè)網(wǎng)點(diǎn)關(guān)閉、公司要倒閉?韻達(dá)快遞緊急回應(yīng):假的!春節(jié)期間人手不足,已采...
- 張朝陽(yáng)再談四小時(shí)睡眠法 最科學(xué)的睡眠時(shí)間
- 劉畊宏女孩回來(lái)了 你準(zhǔn)備好做個(gè)劉畊宏女孩
- 打擊電信網(wǎng)絡(luò)詐騙等 湖北恩施:非必要不前
- 2023年來(lái)最強(qiáng)雨雪上線(xiàn) 降雪最南線(xiàn)將會(huì)抵達(dá)
- 女子稱(chēng)買(mǎi)到藍(lán)環(huán)章魚(yú)險(xiǎn)食用 世界上最毒的藍(lán)
- 當(dāng)生育和婚姻解綁:未婚媽媽的抗?fàn)?聽(tīng)從內(nèi)
- 部分城市調(diào)整首套房貸款利率 購(gòu)房成本持續(xù)
- 茅臺(tái)立春酒定價(jià)2899元 系茅臺(tái)首款“數(shù)實(shí)融
- 預(yù)處理指令用法詳解(C語(yǔ)言)-天天快播報(bào)
- 環(huán)比和同比的區(qū)別是什么?與上一年對(duì)比叫環(huán)
- Meta“效率之年”并不高效:裁員傳聞導(dǎo)致規(guī)
- 報(bào)告:超8成受訪(fǎng)者認(rèn)為游戲促進(jìn)AI發(fā)展
- 2023年2月13日上期所部分品種“倉(cāng)單日?qǐng)?bào)”-
- 被《王國(guó)之淚》致敬?有游戲表示早就做出了
- 為抵制《霍格沃茨》 LGBTQ+創(chuàng)作者發(fā)布游戲
- 信用卡和儲(chǔ)蓄卡的區(qū)別是什么?公務(wù)卡可以個(gè)
- 信用卡可以取現(xiàn)金嗎?信用卡能轉(zhuǎn)賬到微信嗎
- 優(yōu)雅女人的衣櫥中怎能少了一席長(zhǎng)裙,保暖時(shí)
- 三歲以下嬰幼兒照護(hù)費(fèi)用專(zhuān)項(xiàng)扣除什么意思?
- 定期存款三大忌有哪些?老人存錢(qián)最好的方法
- 個(gè)人養(yǎng)老金賬戶(hù)是什么意思?養(yǎng)老金個(gè)人賬戶(hù)
- 老鳳祥黃金價(jià)格今天多少錢(qián)一克?老鳳祥金鐲
- 南京部分取餐柜試水向騎手收費(fèi) 你怎么看呢
- 2023年麒麟電池概念股有哪些?麒麟電池龍頭
- 國(guó)內(nèi)首個(gè)百兆瓦級(jí)液冷儲(chǔ)能項(xiàng)目,科華數(shù)能液
- 最近為什么市場(chǎng)上時(shí)長(zhǎng)4小時(shí)的電池儲(chǔ)能電站
- 儲(chǔ)能產(chǎn)業(yè)鏈五大趨勢(shì)研判-全球熱頭條
- 走進(jìn)虛擬電廠——技術(shù)篇
- 灰氫之后是綠氫-世界速讀
- Horizon Investments首席投資官Scott Lad
- 科技企業(yè)競(jìng)跑ChatGPT賽道 多領(lǐng)域智慧應(yīng)用可期
- 開(kāi)普云:公司數(shù)字人已與OpenAI的GPT3-003接
- 社區(qū)團(tuán)購(gòu)末路:團(tuán)長(zhǎng)累了,經(jīng)銷(xiāo)商跑了
- 大作難產(chǎn)、項(xiàng)目被砍,育碧怕不是快寄了?-
- 不買(mǎi)房、不買(mǎi)股推升居民存款大增?中金:關(guān)
- 北約網(wǎng)站遭黑客攻擊 包括“北約特種作戰(zhàn)司
- 《塞爾達(dá)傳說(shuō)王國(guó)之淚》林克和大師劍設(shè)定圖
- 2000多個(gè)網(wǎng)點(diǎn)關(guān)閉、公司要倒閉?韻達(dá)快遞緊