宏定义#Define和Typedef的用法和区别

一:各自的定义

  (一)

  Typedef 本身是一种存储类的关键字,在计算机编程语言中用来为复杂的声明定义简单的别名。

  Typedef 的含义:

  1. 找到你所要声明的通用格式。例如这里申明 inta[4],b[4],c[4],只有a,b,c不同,但是他们有相同的申明模式 int<名字>[4];
  2. 用你想要申明的新类型名代替通用格式中的变化部分。例如这里就是用新类型int_array代替a,b,c所在的位置,再在前面加上Typedef符号
  3. 以后你想申明处在上面int_array位置的a,b,c类型时,就可以用:int_array a,b,c;

所以在程序中,可能需要为某些整数定义一个别名,我们就可以利用预处理指令#define来完成。

用途一:

  定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。

        比如:char* pa, pb;        // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针和一个字符变量;

  以下则可行:

  typedef char* PCHAR; // 一般用大写

  PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针

  虽然:char *pa, *pb;

       也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。

  用途二:

  用typedef来定义与平台无关的类型。

  比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

  typedef long double REAL;

  在不支持 long double 的平台二上,改为:

  typedef double REAL;

  在连 double 都不支持的平台三上,改为:

  typedef float REAL;

  也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。

  标准库就广泛使用了这个技巧,比如size_t。

  另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。

  用途三:

  为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:

  1. 原声明:int *(*a[5])(int, char*);

  变量名为a,直接用一个新别名pFun替换a就可以了:

  typedef int *(*pFun)(int, char*);

  原声明的最简化版:

  pFun a[5];

  2. 原声明:void (*b[10]) (void (*)());

  变量名为b,先替换右边部分括号里的,pFunParam为别名一:

  typedef void (*pFunParam)();

  再替换左边的变量b,pFunx为别名二:

typedef void (*pFunx)(pFunParam);

 

(二)宏定义#define又称为宏代换、宏替换,简称“

格式:

1.

#define标识符字符串

其中的标识符就是所谓的符号常量,也称为宏名”,

例如:

#definePi3.1415926

就是把程序中出现的Pi全部换成3.1415926

2.除了一般的字符串替换,还要做参数代换

格式:

#define宏名(参数表)字符串

例如:#defineS(a,b)a*b

area=S(3,2)

第一步被换为area=a*b;,第二步被换为area=3*2;

类似于函数调用

简单的宏定义有如下格式:

[#define指令 (简单的宏)]  #define 标识符替换列表

当预处理器遇到一个 宏定义时,会做一个“标识符”代表“替换列表”的记录,在文件后面的内容中,不管标识符在任何位置出现,预处理器都会用替换列表代替它。

简单的宏主要用来定义 明示常量的东西,使用宏,我们可以给数值,字符,和字符串命名。

#define STE_LEN   80

#define TRUE   1

#define FALSE   0

#define PI    3.14159

#define CR    ‘\r’

#define  EOS   ‘\0’

二:区别

Typedef 和宏定义的区别:

Define是一种智能替换,而typedef是告诉编译器,为这个类型取了一个别名,而不是像宏一样是一种文本替换了。

使用define:

#define Mytype int*

Mytype a,b; //此时出现差异,a为指向int的指针变量,而b为int变量

使用typedef:

   Typedef int *mytype;

Mytype a,b; //a,b均为指向int 的指针变量

由此可见,当我们在函数中,需要连续声明多个像这种指针变量时,则应该使用typedef,用typedef定义的类型能够保证声明中所有的变量均为同一类型。

还有在 const关键字修饰下也不同:

n=2;

const Mytype a;

a=&n;

//这时候就出现错误了,因为const 修饰的是int,此时a是一个指向常量的指针;

Const mytype b=n;

//此时const修饰的是int*,b是一个常指针;

 

猜你喜欢

转载自blog.csdn.net/qq_41321905/article/details/83929774