#define TIME_NUM 1000 //定義一個時間數複製代碼
一個簡單的TIME_NUM 就定義好了,它表明1000,若是在程序裏面寫:安全
if(i<TIME_NUM )
{
....
....
}複製代碼
編譯器在處理這個代碼以前會對TIME_NUM 進行處理替換爲1000。這樣的定義看起來相似於普通的常量定義CONST,但也有着不一樣,由於define的定義更像是簡單的文本替換,而不是做爲一個量來使用。函數
#define 標識符 被標識符表明的字符串 //這種用法很簡單,就是一種替換.複製代碼
#define 標識符[(參數1,.....,參數n)] 被標識符表明的字符串 //其中,在 "被標識符表明的字符串" 中出現的形參將在使用時被實參替代. 就像寫函數同樣.複製代碼
例如:spa
#define ADD_NUM 10 複製代碼
也能夠這樣子用:指針
#define ADD(x,y) (x+y)複製代碼
這個定義就將返回兩個數中較大的那個,看到了嗎?由於這個「函數」沒有類型檢查,就好像一個函數模板似的,固然,它絕對沒有模板那麼安全就是了。能夠做爲一個簡單的模板來使用而已。可是這樣作的話存在隱患,例子以下:code
#define ADD(a,b) a+b複製代碼
在通常使用的時候是沒有問題的,可是若是遇到如:c Add(a,b) d的時候就會出現問題,代數式的本意是a+b而後去和c,d相乘,可是由於使用了define(它只是一個簡單的替換),因此式子實際上變成了 ca + bd 因此,用#define要注意順序cdn
通常我我的用#define在單片機程序上的話,我通常只作簡單的替換。開發
#define TIME_NUM (60*60*24)UL//定義一個一天時間有多少秒複製代碼
另外舉一個例子:字符串
#define pin (int*);
pin a,b;複製代碼
本意是a和b都是int型指針,可是實際上變成int* a,b;a是int型指針,而b是int型變量。這是應該使用typedef來代替define,這樣a和b就都是int型指針了。因此咱們在定義的時候,養成一個良好的習慣,建議全部的層次都要加括號。編譯器
並且,宏在單片機代碼中用的不少,常數的替換、地址的偏移,等等都用得上用宏來修改移植代碼更加便捷,代碼更容易令人讀懂。。。。it
相關代碼能夠在公衆號後臺獲取。
歡迎關注「物聯網IoT開發」公衆號