define是預處理指令,在編譯時不進行任何檢查,只進行簡單的替換git
宏定義的通常形式爲:github
#define 宏名 字符串
這裏所說的字符串是通常意義上的字符序列,不要和C語言中的字符串等同,它不須要雙引號。微信
typedef是在C語言中用來爲複雜的聲明定義簡單的別名,它自己是一種存儲類的關鍵字,與auto、extern、mutable、static、register等關鍵字不能出如今同一個表達式中。指針
typedef取別名的通常形式爲:code
typedef 舊名字 新名字
(1)#define以後不帶分號,typedef以後帶分號。rem
(2)#define可使用其餘類型說明符對宏類型名進行擴展,而 typedef 不能這樣作。如:字符串
#define INT1 int unsigned INT1 n; //沒問題 typedef int INT2; unsigned INT2 n; //有問題
INT1可使用類型說明符unsigned進行擴展,而INT2不能使用unsigned進行擴展。get
(3)在連續定義幾個變量的時候,typedef 可以保證定義的全部變量均爲同一類型,而 #define 則沒法保證。如:博客
#define PINT1 int*; P_INT1 p1,p2; //即int *p1,p2; typedet int* PINT2; P_INT2 p1,p2; //p一、p2 類型相同
PINT1定義的p1與p2類型不一樣,即p1爲指向整形的指針變量,p2爲整形變量;PINT2定義的p1與p2類型相同,即都是指向 int 類型的指針。string
下面看一個關於typedef的重要的問題!!請看代碼:
#include <stdio.h> typedef char *pStr; int main(void) { char string[4]="abc"; //第一行代碼 const char *p1=string; //第二行代碼 const pStr p2 = string; //第三行代碼 p1++; //第四行代碼 p2++; //第五行代碼 return 0; }
這段代碼編譯會報一個錯誤:error: increment of read-only variable 'p2'
,你知道問題出在哪嗎?
答案與解析:
是第五行代碼p2++出錯了。這個問題提醒咱們:typedef和#define不一樣,它不是簡單的文本替換。上述代碼中const pStr p2並不等於const char * p2。const pStr p2和pStr const p2本質上沒有區別,都是對變量進行只讀限制,只不過此處變量p2的數據類型是咱們本身定義的而不是系統固有類型而已。
所以,const pStr p2的含義是:限定數據類型爲char 的變量p2爲只讀,即爲char const p2,代表p2是一個指向char類型的常指針,因此p2是不可修改的,所以p2++錯誤。
順便提一下關於const聲明的一些例子及其含義:
const int a; //① int const b; //② const int *c; //③ int * const d; //④ int const * e const; //⑤
①a是常數,不可改變;
②b是常數,不可改變;
③c是一個指向整型常數的指針,指針能夠變,指針指向的內容不能夠變;
④d是一個指向整型變量的常指針,指針不能夠變,指針指向的內容能夠變;
⑤e是一個指向整型常數的常指針,指針與指針指向的內容都不可變。
個人我的博客:https://zhengnianli.github.io/
個人微信公衆號:嵌入式大雜燴