**自:
學習了這麼多年c語言,說實話對巨集自以為瞭如指掌了,沒想到看核心**的時候還是那麼吃力,裝置驅動**中有很多這樣或者那樣的巨集定義,各種define,博主在學習的過程中將c語言中所出現的#define定義整理總結了一下,供大家借鑑和學習。
原來以為什麼是巨集?無非就是定義乙個替換的量,好比#define pi
3.1415926,這樣的功能,再深一點就是寫乙個類似函式的定義,好比#define max(a,b) ((a) > (b) ? (a) :
(b))這樣的功能,再問一下巨集是什麼?無非就是預處理階段所要展開的亂七八糟的東西,其實也就知道這麼點,當看了linux kernel
code,其實會發現自己懂得那些其實都是皮毛,不值一提的小東西,才發現自己out了,為此博主將#define的使用方法總結了一下,如下所示:(如有不足請批評指正)
1. 最最最簡單的define定義
不贅述了,說一下其他的吧,如#define max
10,編譯器在處理這個**之前會對max進行處理,替換為10,或許有些人認為這樣的定義看起來和const常量很相似,但是他們還是有區別
的,#define的定義其實就是簡單的文字的替換,並不是作為乙個量來使用
2. 用#define來對函式進行「定義」
很多就會問了,什麼?居然還能用#define來定義函式,坑爹麼?其實咋說呢,就是類似的乙個函式定義罷了,和真正的函式定義當然還是有區別的了,下面進行舉例說明:
還是用上面的max的例子:#define max(a,b) ((a) > (b) ? (a) : (b)),這個定義就返回兩個數中較大的那個,不知道你們看到了沒看到,這個」函式「沒有型別檢查,像不像函式模板?像?不像?
其實是有點像的,可以作為乙個普通的模板來使用罷了,他肯定沒函式模板那麼安全,why?看下面的例子:
#define minus(a,b) a - b,眨眼一看,這個肯定是減法操作的define,有木有?對,沒錯,就是這個意思,這個定義在一般的使用中沒問題,但是在特定的情況下使用會出現問題,如果我們要這樣去使用 的話,展開之後會是什麼樣子呢?如:2 * minus(a,b) / 4,就像我前面所說的那樣,巨集其實就是乙個簡單的文字替換,所以展開時候就變為 2 * a - b / 4,和我們想要的結果是不是不一樣?是不是錯 了?有木有?那要如何解決這個問題呢,很簡單,給原定義加乙個括號就ok了,也就是#define minus(a,b
) (a - b)
再說乙個經常出現的乙個錯誤,看下面的例子:
#define pin (int *)
pin a,b;
本意其實都想讓a和b成為int型指標,但是實際上卻變成了int *a,b;a是int型指標,b是int型變數,咋處理捏?這個時候typedef就出來了,它說我可以滿 足define滿足不了的要求,所以改成
typedef pin (int *) 就ok了。
tip:我們在寫code的時候一定要養成乙個良好的習慣和乙個良好的**編寫風格,建議所有的層次都加上括號
3. define的單行定義,舉例說明之,屬於少見用法
#define a(x) ##x
#define b(x) #@x
#define c(x) #x
如果我們假設x=1,那麼a(1)就是1,b(1)就是『1』,c(1)就是」1「
4. define的多行定義
#define可以進行多行定義,雖然看起來有點蛋疼,但是確實是乙個灰常經典而且在裝置驅動**中經常要用到的乙個方法,格式如下:
#define macro(arg1,arg2) do while(0)
tip:在每一行的末尾要加上\,切記!
5. 定義巨集和取消巨集定義的方法
定義乙個巨集使用#define,取消乙個巨集定義使用#undef
6. 使用巨集進行條件編譯
格式如下:#ifdef ... (#else) ... #endif
如:#ifdef hello
#define world 1
#else
#define world 0
#endif
7. 用define來處理標頭檔案被標頭檔案或者原始檔包含的情況
由於標頭檔案包含可以巢狀,那麼c檔案有可能包含多次同乙個標頭檔案,就會出現重複定義的問題的,那麼可以就通過條件編譯開關來避免重複包含,如下:
#ifndef _hello_h_
#define _hello_h_
...//檔案內容
...#endif
C語言中define的用法
1 最簡單且最常見的define用法 define n 100編譯器在預處理程式時,會將程式中所有的n用100來替換,換言之,不同於const常量,define其實本質上對文字內容的替換。下面是define和const的區別 define是巨集定義,程式在預處理階段將用define定義的內容進行了替...
C語言中 define 巨集定義的使用總結
例如 define love 520printf d love 使用love時不需要再定義以及賦值,輸出列印為 5201 巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用 undef命令。2 如果乙個巨集的值超過一行,最後一行之前的行末需要加 例如 define...
C語言中 define用法總結
1.簡單的巨集定義 define 識別符號 替換列表 替換列表可以是數,字串字面量,標點符號,運算子,識別符號,關鍵字,字元常量。注意 替換列表是可以為空的 典型錯誤 define n 100 int a n 這樣會成為int a 100 這裡會處理成為一種標識記號一樣 define n 100 i...