【C語言筆記】#define與typedef的區別


1、#define

define是預處理指令,在編譯時不進行任何檢查,只進行簡單的替換

宏定義的一般形式為:

#define 宏名 字符串

這里所說的字符串是一般意義上的字符序列,不要和C語言中的字符串等同,它不需要雙引號。

2、typedef

typedef是在C語言中用來為復雜的聲明定義簡單的別名,它本身是一種存儲類的關鍵字,與auto、extern、mutable、static、register等關鍵字不能出現在同一個表達式中。

typedef取別名的一般形式為:

typedef  舊名字  新名字

3、define與typedef的區別

(1)#define之后不帶分號,typedef之后帶分號。

(2)#define可以使用其他類型說明符對宏類型名進行擴展,而 typedef 不能這樣做。如:

#define INT1 int
unsigned INT1 n;  //沒問題
typedef int INT2;
unsigned INT2 n;  //有問題

INT1可以使用類型說明符unsigned進行擴展,而INT2不能使用unsigned進行擴展。

(3)在連續定義幾個變量的時候,typedef 能夠保證定義的所有變量均為同一類型,而 #define 則無法保證。如:

#define PINT1 int*;
P_INT1 p1,p2;  //即int *p1,p2;
typedet int* PINT2;
P_INT2 p1,p2;  //p1、p2 類型相同

PINT1定義的p1與p2類型不同,即p1為指向整形的指針變量,p2為整形變量;PINT2定義的p1與p2類型相同,即都是指向 int 類型的指針。

下面看一個關於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/

我的微信公眾號:嵌入式大雜燴


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM