typedef与define的区别

(一)typedef

(1)typedef 为某一种类型引入新的名字 ,并不为变量分配内存空间

(2)不可以同时将多个声明放在一个typedef

(3)举例说明

typedef int KeyType //为int引入新名字

int a ;//定义一个整型变量a

KeyType b;//定义一个整型变量b


typedef int* ptr,(*fun)(),arr[5];
/*
int *ptr;//只有ptr是int*

int (*fun)();//int 

int arr[5];//int
*/

(二)define

#define只是简单地宏替换,在预编译阶段展开 ,不进行任何的安全性检查

typedef int* INT_PTR;

#define int* int_PTR;



//两者定义变量
INT_PTR a,b;//a b 都是int*类型
int_PTR a,b;//a 是int*类型 b是int类型


(三)define中的"#"和“##”的用法

第一种用法:#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.  例子如下图所示

#define STR(s) #s//"#"定义s为字符串类型
#define CONS(a,b) int(a##b)//两个"##"用于连接两个参数

int main()
{
	printf("%s\n",STR(vsf));//字符串vsf
	printf("%s\n",CONS("hello","world"));//连接两个字符串helloworld
}
#define STR(s) #s//"#"定义s为字符串类型
#define CONS(a,b) int(a##b)//两个"##"用于连接两个参数 

int main()
{
	printf("%s\n",STR(vsf));//字符串vsf
	printf("%s\n",CONS("hello","world"));//连接两个字符串helloworld
        //上面a b变量没有通过#定义 所以必须在传参时定义它
}

第二种:

凡是宏定义里有"#"或者"##"的地方宏参数都不在展开

(1)没有“#”或者“##”

#define A          (2) 
#define STR(s)  #s//"#"定义s为字符串类型
#define CONS(a,b) int(a##e##b)//两个"##"用于连接两个参数
#define COW(a,b) int(a*b)


int main()
{
	//凡宏定义里有用''#''或''##''的地方宏参数是不会再展开. 
	//printf("%s\n",CONS(A,A));//error由于A不再进行宏展开 并且A属于为标识符
	printf("%s\n",STR(CONS(A,A)));//结果为CONS(A,A)是一个字符串
	//STR里的参数现在已经是一个字符串而已

        //(1)
	printf("%d,%d,%d\n",A,A,COW(A,A));//2 2 4

	return 0;
}
#define A          (2) 
#define STR(s) #s//"#"定义s为字符串类型
#define CONS(a,b) int(a##e##b)//两个"##"用于连接两个参数


int main()
{
	//凡宏定义里有用''#''或''##''的地方宏参数是不会再展开.  
       
        //(2)
	printf("%s\n",CONS(A,A));//error由于A不再进行宏展开 并且A属于为标识符
	printf("%s\n",STR(CONS(A,A)));//结果为CONS(A,A)是一个字符串
	//STR里的参数现在已经是一个字符串而已

	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值