C語言中宏定義都有那些盲區?
導讀 | #define 是C語言中的一個宏定義 ,它用來將一個識別符號定義為一個字串,該識別符號被稱為宏名,被定義的字串稱為替換文字。 |
命令有兩種格式:一種是簡單的宏定義,另一種是帶引數的宏定義。
(1)簡單的宏定義:
#define <宏名> <字串>
#define VALUE ((sizeof(a)) /sizeof(a[0]))
(2) 帶引數的宏定義 #define <宏名> (<參數列>) <宏體>
#define MAX(a,b) ((a)>(b)?(a):(b))
下面的宏定義中f是否帶了引數呢?
#define f (x) ((x)+1)
答案是否定的,在f與(x)之間存在一個空格,導致變成了如下定義。
#define f (x)((x)+1)
預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程式時發現。
如果我們定義一個宏:
#define MAX(a,b) a>b?a:b
當我們執行一個語句:
3+MAX(1,3);
我們期望的答案應該是6才對,其實呢,執行之後的答案1。與宏定義相掛鉤的就是優先順序,算數運算子的優先順序高於條件運算子,展開如下。
3+1>3?1:3,首先進行算符運算子的運算,即4>3?1:3,所以答案為1。
請注意宏定義中的括號,這些括號的作用就是預防引起優先順序相關的問題。有些專家建議在C語言中只要牢記兩個優先順序就夠了,乘除法優先順序高於加減法,在設計其它運算子時,一律加上括號。
首先定義一個宏
#define pChar char*
再用pChar 定義兩個變數,之後用運算子sizeof讀取變數所佔用記憶體大小,如果是指標型別的就佔4個位元組,如果是字元型的就佔1個位元組。
結果佔用空間不一樣,變數型別自然不一樣,所以宏定義不是型別定義。那如果我換成typedef來定義型別呢?
宏定義只是簡單的字串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明。
編寫程式過程中,很多都需要條件編譯,來看一個常用的使用方法。
#if defined(CREDIT) credit(); #elif defined(DEBIT) debit(); #else printerror(); #endif
宏的本質是程式碼替換。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2914594/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C語言中都有那些運算子?C語言
- c 語言中巨集定義和定義全域性變數的區別變數
- C語言中的標頭檔案中的巨集定義C語言
- c語言中的變數儲存區域C語言變數
- C語言中Pointer, Array,String and Structures的區別C語言Struct
- 宏定義define的用法
- c語言中作用域和儲存期的區別C語言
- C語言中pi=&j和*pi=j的區別C語言
- C語言中的#和##C語言
- 羅技滑鼠永久宏定義設定
- c語言中的作用域C語言
- c語言中sizeof詳解C語言
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- 【C】 30_C語言中的字串C語言字串
- c語言的定義與宣告C語言
- c語言中const修飾符C語言
- static在C語言中的作用C語言
- C 語言中的 sscanf 詳解
- C 語言中的 time 函式函式
- c語言中的getchar()和EOFC語言
- C語言中結構體感悟C語言結構體
- Semver(語義化版本號)掃盲
- C語言中編譯和連結C語言編譯
- c語言中三維陣列C語言陣列
- C語言中的資料型別C語言資料型別
- C 語言中 static 的作用介紹
- C語言中“陣列名”和“&陣列名”C語言陣列
- "->" 在c語言中是什麼意思?C語言
- C語言中qsort函式的用法C語言函式
- c語言函式指標的定義C語言函式指標
- makefile 進行宏定義的便捷之處
- C語言中迴圈語句while 中判斷條件出現 || 和 && 的區別C語言While
- C語言中static關鍵字詳解C語言
- C語言中volatile關鍵字的作用C語言
- C語言中函式的返回值C語言函式
- 淺談C語言中函式的使用C語言函式
- C語言中結構體直接賦值?C語言結構體賦值