define及typedef的应用与区别

194 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

define应用

  1. #define可以为类型取别名,也可以用于定义常量、变量等。
#define a 3                   //此后a=3恒成立
#define U16 unsigned short    //此后定义无符号short型变量可以通过U16定义
  1. 可以用来进行函数定义。
#define MAX(a,b) ((a) > (b) ? (a) : (b))  //此后MAX(4,7)即为7

       当然,也存在多行函数定义,此时每一行后应加上续航符“\”。

#define MACRO(arg1,arg2) do { \
test1; \
test2; \
}while(0)

通过define定义后的变量,以#define a 3为例,无法再通过int等定义名为a的变量,可以使用undef取消该宏定义,示例代码如下所示。

#define a 3  //定义a为3
#undef a     //取消定义

define没有作用域的限制,只要是定义过的宏,在以后的程序中使用时,都会在编译阶段被替换。

typedef应用

  1. 为基本数据类型定义新的类型名。
typedef unsigned short U16 
  1. 为自定义数据类型(结构体、共用体和枚举类型)定义简洁的类型名称。
typedef struct tagPoint
{
    double x;
    double y;
    double z;
} Point;

//此后定义相应的结构体即可:
Point oPoint1={1001000};
Point oPoint2;
  1. 为数组定义简洁的类型名称。
typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;       //相当于int arr[100];
  1. 为指针定义简洁的名称。
typedef char* PCHAR;
PCHAR pa;                 //此时等价于char* pa

// PFun是我们创建的一个类型别名
typedef int *(*PFun)(int,char*);
// 使用定义的类型别名来声明对象,此时等价于int*(*a[5])(int,char*);
PFun a[5];

define及typedef的区别

       #define是预处理中的宏定义命令,在预处理时进行简单的字符串替换,并且不作正确性检查,而typedef是关键字,在编译时处理并进行相应检查。

       define a btypedef b a是一样的用法,即通过a来调用b。

       #define只会进行简单的字符串替换,而typedef则是为1个类型起新名字,一般情况下define和typedef作用相同,但在特殊情况下字符串替换无法代码类型名,示例如下。

typedef char *pStr1;
#define pStr2 char *;

pStr1 s1, s2;
pStr2 s3, s4;

       在上述的变量定义中,s1、s2、s3都被定义为char *类型的变量,而s4则定义成了char类型变量,这是由于字符串替换,使pStr2 s3, s4;变成char* s3,s4,即char* s3char s4