typedef和define的区别

转载文章



typedef

一,定义

typedef:声明自定义数据类型,配合各种原有数据类型,用来简化编程。

二,用途

1,便于移植

typedef int INT32;

INT32 a;//定义整型变量

(INT32) a;//强制转换类型

为什么有int 还要取同名 INT32 ?

答:A微处理器 int 16位,long 32位

B微处理器 short 16位,int 32位,long 64位

原本A处理器下程序:

typedef int INT16;

typedef long INT32;

要移植到B处理器下,则仅仅需要更改这些新名称就行,而不用更改整个程序。

typedef short INT16;

typedef int INT32;

2,在旧的C代码中,帮助struct。

由于在旧的C代码中,声明struct对象时,必须带上struct 。

如:struct node

{

int data;

struct node next; //C语言中必须带上 struct ;而在C++中则可以省略struct

} ;

而写成

typedef struct node

{

int data;

}node_re;

node_re root;

3,定义已有类型的一种别名

typedef char *pchar;

pchar pa,pb;

为指针声明typedef 时,容易出现问题。所以建议:只要为指针声明 typedef,那么都要在最终的 typedef 名称中加一个 const,以使得该指针本身所指对象不会通过指针被修改。

typedef const char *pchar;

define

一,定义:定义宏,即允许用一个标示符来表示一个字串。

二,用处:

1,方便程序修改

定义程序中经常使用的常量,这样在常量改变时,不用对整个程序进行修改。

例如:#define pi 3.141592653 //不用每次都输入3.141592653 直接输入 pi

2,提高程序运行效率

C语言中,函数的使用可以使程序更加模块化,便于组织,而且可以重复利用。

但是,函数调用时,需要保留调用函数的现场,便于子函数执行结束后能返回继续执行。在子函数执行完后要恢复调用函数的现场,这需要一定时间。

如果子函数执行操作较多,这种转换时间可以忽略。但是如果执行功能较少,则开销相对较大。

例如:#define S(a,b) a*b //仅仅是一条乘法 操作

define与typedef的区别

typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量,到了C++,const、enum、inline的出现使它也渐渐成为了起别名的工具。有时很容易搞不清楚与typedef两者到底该用哪个好,如#define INT int这样的语句,用typedef一样可以完成,用哪个好呢?我主张用typedef,因为在早期的许多C编译器中这条语句是非法的,只是现今的编译器又做了扩充。为了尽可能地兼容,一般都遵循#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。

宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。请看上面第一大点代码的第三行:

typedef (int*) pINT;

#define pINT2 int*

效果相同?实则不同!实践中见差别:

pINT a,b;的效果同int a; int b;表示定义了两个整型指针变量。

而pINT2 a,b;的效果同int *a, b;表示定义了一个整型指针,一个整型变量




原文链接: https://www.cnblogs.com/java06/archive/2011/12/16/3122453.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/38700

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午3:17
下一篇 2023年2月8日 下午3:18

相关推荐