C語言宏定義容易認(rèn)不清的盲區(qū)梳理
1、概念
#define命令是C語言中的一個(gè)宏定義命令,它用來將一個(gè)標(biāo)識符定義為一個(gè)字符串,該標(biāo)識符被稱為宏名,被定義的字符串稱為替換文本。
命令有兩種格式:一種是簡單的宏定義,另一種是帶參數(shù)的宏定義。
(1)簡單的宏定義:
#define<宏名> <字符串>
#defineVALUE((sizeof(a))/sizeof(a[0]))
(2) 帶參數(shù)的宏定義
#define<宏名> (<參數(shù)表>)<宏體>
#defineMAX(a,b)((a)>(b)?(a):(b))
2、不能忽略宏定義中的空格
下面的宏定義中f是否帶了參數(shù)呢?
#definef(x)((x)+1)
答案是否定的,在f與(x)之間存在一個(gè)空格,導(dǎo)致變成了如下定義。
#define f (x)((x)+1)

預(yù)處理程序?qū)λ蛔魅魏螜z查。如有錯(cuò)誤,只能在編譯已被宏展開后的源程序時(shí)發(fā)現(xiàn)。
3、宏不是函數(shù)
如果我們定義一個(gè)宏:
#defineMAX(a,b)a>b?a:b
當(dāng)我們執(zhí)行一個(gè)語句:
3+MAX(1,3);
我們期望的答案應(yīng)該是6才對,其實(shí)呢,運(yùn)行之后的答案1。與宏定義相掛鉤的就是優(yōu)先級,算數(shù)運(yùn)算符的優(yōu)先級高于條件運(yùn)算符,展開如下。
3+1>3?1:3,首先進(jìn)行算符運(yùn)算符的運(yùn)算,即4>3?1:3,所以答案為1。
請注意宏定義中的括號,這些括號的作用就是預(yù)防引起優(yōu)先級相關(guān)的問題。有些專家建議在C語言中只要牢記兩個(gè)優(yōu)先級就夠了,乘除法優(yōu)先級高于加減法,在設(shè)計(jì)其它操作符時(shí),一律加上括號。
4、宏定義不是說明或語句
在行末不必加分號,如加上分號則連分號也一起置換
5、宏不是類型定義
首先定義一個(gè)宏
#definepCharchar*
再用pChar 定義兩個(gè)變量,之后用操作符sizeof讀取變量所占用內(nèi)存大小,如果是指針類型的就占4個(gè)字節(jié),如果是字符型的就占1個(gè)字節(jié)。

結(jié)果占用空間不一樣,變量類型自然不一樣,所以宏定義不是類型定義。那如果我換成typedef來定義類型呢?

宏定義只是簡單的字符串代換,是在預(yù)處理完成的,而typedef是在編譯時(shí)處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標(biāo)識符具有類型定義說明。
6、與之相關(guān)的宏定義
編寫程序過程中,很多都需要條件編譯,來看一個(gè)常用的使用方法。
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif7、總結(jié)
宏的本質(zhì)是代碼替換。
到此這篇關(guān)于C語言宏定義容易認(rèn)不清的盲區(qū)梳理的文章就介紹到這了,更多相關(guān)C語言宏定義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)Date類各種運(yùn)算符重載的示例代碼
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)Date類各種運(yùn)算符重載的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
C語言自定義實(shí)現(xiàn)strlen函數(shù)的3種方法總結(jié)
這篇文章帶大家了解C語言中自定義實(shí)現(xiàn)strlen函數(shù)的3種方法,計(jì)數(shù)器,遞歸以及指針,這三種方法通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08
C++學(xué)習(xí)之智能指針中的unique_ptr與shared_ptr
吃獨(dú)食的unique_ptr與樂于分享的shared_ptr是C++中常見的兩個(gè)智能指針,本文主要為大家介紹了這兩個(gè)指針的使用以及智能指針使用的原因,希望對大家有所幫助2023-05-05

