C語言中宏定義都有那些盲區?
導讀 | #define 是C語言中的一個宏定義 ,它用來將一個識別符號定義為一個字串,該識別符號被稱為宏名,被定義的字串稱為替換文字。 |
1、概念
命令有兩種格式:一種是簡單的宏定義,另一種是帶引數的宏定義。
(1)簡單的宏定義:
#define <宏名> <字串>
#define VALUE ((sizeof(a)) /sizeof(a[0]))
(2) 帶引數的宏定義 #define <宏名> (<參數列>) <宏體>
#define MAX(a,b) ((a)>(b)?(a):(b))
2、不能忽略宏定義中的空格
下面的宏定義中f是否帶了引數呢?
#define f (x) ((x)+1)
答案是否定的,在f與(x)之間存在一個空格,導致變成了如下定義。
#define f (x)((x)+1)
預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被宏展開後的源程式時發現。
3、宏不是函式
如果我們定義一個宏:
#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語言中只要牢記兩個優先順序就夠了,乘除法優先順序高於加減法,在設計其它運算子時,一律加上括號。
4、宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換
5、宏不是型別定義
首先定義一個宏
#define pChar char*
再用pChar 定義兩個變數,之後用運算子sizeof讀取變數所佔用記憶體大小,如果是指標型別的就佔4個位元組,如果是字元型的就佔1個位元組。
結果佔用空間不一樣,變數型別自然不一樣,所以宏定義不是型別定義。那如果我換成typedef來定義型別呢?
宏定義只是簡單的字串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明。
6、與之相關的宏定義
編寫程式過程中,很多都需要條件編譯,來看一個常用的使用方法。
#if defined(CREDIT) credit(); #elif defined(DEBIT) debit(); #else printerror(); #endif
7、總結
宏的本質是程式碼替換。
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2914594/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C語言中都有那些運算子?C語言
- c 語言中巨集定義和定義全域性變數的區別變數
- C語言中&&,||,&,| 的區別C語言
- C語言中的標頭檔案中的巨集定義C語言
- C語言中sync()C語言
- C語言中有C語言
- C語言中const和#define的區別C語言
- C語言中的strlen與sizeof的區別C語言
- C語言(巨集定義)C語言
- C語言中輸入輸出重定,freopen()妙用。C語言
- C語言中pi=&j和*pi=j的區別C語言
- C語言中Pointer, Array,String and Structures的區別C語言Struct
- C系列語言中.c&&.h檔案內容的區分
- 解析C語言中的sizeofC語言
- C語言中extern的用法C語言
- c語言中sizeof詳解C語言
- c語言中的&的用法C語言
- C語言中malloc與freeC語言
- 【C】 30_C語言中的字串C語言字串
- Semver(語義化版本號)掃盲
- c語言的定義與宣告C語言
- 深入瞭解C語言(區域性變數的定義) (轉)C語言變數
- C 語言中的 time 函式函式
- C語言中結構體感悟C語言結構體
- c語言中的關鍵字C語言
- C語言中的檔案流C語言
- C語言中的*和&符號C語言符號
- C語言中如何寫斷言C語言
- C語言中的abort函式C語言函式
- 解析C語言中的sizeof (轉)C語言
- c語言函式指標的定義C語言函式指標
- C語言中“陣列名”和“&陣列名”C語言陣列
- C 語言中 static 的作用介紹
- "->" 在c語言中是什麼意思?C語言
- c語言中的getchar()和EOFC語言
- C語言中qsort函式的用法C語言函式
- 【轉】C語言中 -> 是什麼意思?C語言
- C語言中 * 和 &的實際理解C語言