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