一.預(yù)定義符號
C標(biāo)準(zhǔn)定義了如下五個(gè)預(yù)處理符號

在文件輸入輸出以及輸出日志等場合下我們會用到這些預(yù)處理符號,比如

\+回車 : 續(xù)行符,轉(zhuǎn)義字符,后面不能加任何除回車之外的字符,否則會報(bào)錯(cuò)
二.#define關(guān)鍵字
#define有兩個(gè)作用,一個(gè)是定義標(biāo)識符,第二個(gè)是定義宏
1.定義標(biāo)識符

不要在define定義的標(biāo)識符里加分號
2.定義宏
#define機(jī)制包括一個(gè)規(guī)定,允許把參數(shù)替換到文本中,這種實(shí)現(xiàn)通常叫做宏或定義宏

宏定義永遠(yuǎn)不要吝嗇括號,防止因?yàn)閮?yōu)先級的問題導(dǎo)致出現(xiàn)不可思議的后果 宏不能實(shí)現(xiàn)遞歸 宏只文本替換,并不簡化計(jì)算 字符串中的內(nèi)容不會發(fā)生宏替換

3.#和 ##
編譯器會自動就兩個(gè)相鄰字符串自動連接成一個(gè)
#:把參數(shù)插入到字符串中
#a -> “a”

##可以把位于它兩邊的符號拼成一個(gè)符號

4.宏和函數(shù)對比
①宏沒有類型檢查
沒有類型檢查是宏的一大特點(diǎn)(但同時(shí)也是不安全的隱患),可以完成很多函數(shù)不可能做到的功能

②宏沒有函數(shù)的調(diào)用和返回等額外開銷,效率更高,
但是當(dāng)邏輯復(fù)雜并且代碼量巨大時(shí),調(diào)用和返回的開銷和運(yùn)算的時(shí)間相比微乎其微,可以省略
③宏單純只是文本替換,不能進(jìn)行調(diào)試,很致命
④宏可能會使代碼長度增長
⑤函數(shù)的參數(shù)如果是一個(gè)表達(dá)式,會計(jì)算出表達(dá)式的結(jié)果傳入?yún)?shù)
宏的參數(shù)如果是一個(gè)表達(dá)式,只會文本替換,不會進(jìn)行計(jì)算
總結(jié):各有千秋,小代碼量使用宏,大代碼量使用函數(shù),C++中擯棄宏這一概念,使用內(nèi)聯(lián),基于優(yōu)缺點(diǎn),最好不要使用宏
5.帶有副作用的宏參數(shù)

不要給宏參數(shù)傳入帶有副作用的參數(shù)
6.命名約定
宏:全部大寫
函數(shù): 不全部大寫
例外

#undef name //取消宏標(biāo)識符name的定義
三.條件編譯
1.如果定義了DEBUG,語句執(zhí)行,反之,不執(zhí)行

2.條件編譯

3.多分支條件編譯

3.判斷是否被定義

4.嵌套指令
預(yù)處理指令可以進(jìn)行嵌套

四.其它
1.頭文件的包含

2.#error “…”
遇到#error便會產(chǎn)生一個(gè)編譯錯(cuò)誤
3.strcpy();
源字符串必須以’/0’結(jié)束,返回目標(biāo)字符串地址且這個(gè)函數(shù)不管目標(biāo)空間是否放得下返回的目標(biāo)字符串
4.assert(條件語句)
善用斷言,頭文件為
5.鏈?zhǔn)椒磻?yīng)
這次函數(shù)的返回值可以作為下一個(gè)函數(shù)的參數(shù),達(dá)到鏈?zhǔn)椒磻?yīng)的效果
printf(“%d\n”,strlen(strcpy(p,”hello world!”)));
6.常見錯(cuò)誤:
編譯型錯(cuò)誤
直接看編譯器錯(cuò)誤提示信息即可 鏈接型錯(cuò)誤
函數(shù)名,變量名寫錯(cuò),庫文件使用錯(cuò)誤(第三方庫) 運(yùn)行時(shí)錯(cuò)誤
-
C語言
+關(guān)注
關(guān)注
183文章
7646瀏覽量
146092 -
編譯器
+關(guān)注
關(guān)注
1文章
1672瀏覽量
51883
原文標(biāo)題:C語言#define關(guān)鍵字,條件編譯及預(yù)定義符號知識詳解
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
C語言宏定義與枚舉類型知識
C語言中預(yù)定義宏的用法和使用場景
C語言中條件編譯的妙用
C語言程序設(shè)計(jì)教程之編譯預(yù)處理的詳細(xì)資料說明
C語言中#和##符號有什么樣的作用
c語言之條件編譯技巧與示例分析
C語言關(guān)于變量定義未使用編譯警告warring
C語言:條件編譯及預(yù)定義符號知識詳解
評論