(一)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;
}