Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6942214
  • 博文数量: 701
  • 博客积分: 10821
  • 博客等级: 上将
  • 技术积分: 12021
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-02 10:41
个人简介

中科院架构师,专注企业数字化各个方面,MES/ERP/CRM/OA、物联网、传感器、大数据、ML、AI、云计算openstack、Linux、SpringCloud。

文章分类

全部博文(701)

分类: C/C++

2020-06-12 11:31:34

typedef和define都是替一个对象取一个别名,以此增强程序的可读性,区别如下:

(1)原理不同
#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。
例如: 
#define PI 3.1415926 
程序中的:area=PI*r*r 会简单替换为3.1415926*r*r 
注意是不做正确性检查的,对与PI没有类型。

typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。
例如:typedef uint64_t  u64
程序中typedef u64 async_cookie_t; 为64位无符号整数

(2)功能不同
typedef用来定义类型的别名。
a)简短易于记忆。
b)定义与机器无关的类型,屏蔽不同平台的类型差异化。
如,定义一个叫 REAL 的浮点类型:
在目标平台一,表示最高精度的类型为:typedef long double REAL;
在不支持 long double 的平台二上,改为:typedef double REAL;
在连 double 都不支持的平台三上,改为:typedef float REAL;
即跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。
typedef是定义一种类型的新别名,不是简单的字符串替换。

#define用于宏定义,不只是可以为类型取别名,还可以定义常量、变量、编译开关等。

(3)作用域不同
#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。
而typedef有自己的作用域。

(4)对指针的操作不同
#define INTPTR1 int*
typedef int* INTPTR2;
INTPTR1 p1, p2;  
简单替换为 int* p1,p2; 即声明一个指针变量p1、一个整型变量p2
INTPTR2 p3, p4; 
含义是int *p3; int *p4;(注意两个分号),声明两个指针变量p3、p4

#define INTPTR1 int*
typedef int* INTPTR2;
int a = 1;
int b = 2;
int c = 3;
const INTPTR1 p1 = &a;
const INTPTR2 p2 = &b;
INTPTR2 const p3 = &c;
说明:
const INTPTR1 p1; // p1是一个常量指针,p1可更改(指向可以发生变化),但是p1指向的内容不可更改。
const INTPTR2 p2;//p2是一个指针常量,p2不可更改,但p2指向的内容可更改。不可使p2再指向其他内容。因为INTPTR2表示一个指针类型,因此用const限定,表示封锁了这个指针类型。
INTPTR2 const p3是一个指针常量

阅读(1658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~