一.預(yù)定義符號
C標準定義了如下五個預(yù)處理符號
在文件輸入輸出以及輸出日志等場合下我們會用到這些預(yù)處理符號,比如
\+回車 : 續(xù)行符,轉(zhuǎn)義字符,后面不能加任何除回車之外的字符,否則會報錯
二.#define關(guān)鍵字
#define有兩個作用,一個是定義標識符,第二個是定義宏
1.定義標識符
不要在define定義的標識符里加分號
2.定義宏
#define機制包括一個規(guī)定,允許把參數(shù)替換到文本中,這種實現(xiàn)通常叫做宏或定義宏
宏定義永遠不要吝嗇括號,防止因為優(yōu)先級的問題導(dǎo)致出現(xiàn)不可思議的后果 宏不能實現(xiàn)遞歸 宏只文本替換,并不簡化計算 字符串中的內(nèi)容不會發(fā)生宏替換
3.#和 ##
編譯器會自動就兩個相鄰字符串自動連接成一個
#:把參數(shù)插入到字符串中
#a -> “a”
##可以把位于它兩邊的符號拼成一個符號
4.宏和函數(shù)對比
①宏沒有類型檢查
沒有類型檢查是宏的一大特點(但同時也是不安全的隱患),可以完成很多函數(shù)不可能做到的功能
②宏沒有函數(shù)的調(diào)用和返回等額外開銷,效率更高,
但是當(dāng)邏輯復(fù)雜并且代碼量巨大時,調(diào)用和返回的開銷和運算的時間相比微乎其微,可以省略
③宏單純只是文本替換,不能進行調(diào)試,很致命
④宏可能會使代碼長度增長
⑤函數(shù)的參數(shù)如果是一個表達式,會計算出表達式的結(jié)果傳入?yún)?shù)
宏的參數(shù)如果是一個表達式,只會文本替換,不會進行計算
總結(jié):各有千秋,小代碼量使用宏,大代碼量使用函數(shù),C++中擯棄宏這一概念,使用內(nèi)聯(lián),基于優(yōu)缺點,最好不要使用宏
5.帶有副作用的宏參數(shù)
不要給宏參數(shù)傳入帶有副作用的參數(shù)
6.命名約定
宏:全部大寫
函數(shù): 不全部大寫
例外
#undef name //取消宏標識符name的定義
三.條件編譯
1.如果定義了DEBUG,語句執(zhí)行,反之,不執(zhí)行
2.條件編譯
3.多分支條件編譯
3.判斷是否被定義
4.嵌套指令
預(yù)處理指令可以進行嵌套
四.其它
1.頭文件的包含
2.#error “…”
遇到#error便會產(chǎn)生一個編譯錯誤
3.strcpy();
源字符串必須以’/0’結(jié)束,返回目標字符串地址且這個函數(shù)不管目標空間是否放得下返回的目標字符串
4.assert(條件語句)
善用斷言,頭文件為
5.鏈式反應(yīng)
這次函數(shù)的返回值可以作為下一個函數(shù)的參數(shù),達到鏈式反應(yīng)的效果
printf(“%d\n”,strlen(strcpy(p,”hello world!”)));
6.常見錯誤:
編譯型錯誤
直接看編譯器錯誤提示信息即可 鏈接型錯誤
函數(shù)名,變量名寫錯,庫文件使用錯誤(第三方庫) 運行時錯誤
-
C語言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135858 -
編譯器
+關(guān)注
關(guān)注
1文章
1617瀏覽量
49015
原文標題:C語言#define關(guān)鍵字,條件編譯及預(yù)定義符號知識詳解
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論