c++--typedef和#define的用法及区别

typedef的用法

在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像:

typedef int INT;
typedef int ARRAY[10];
typedef (int*) pINT;

typedef可以增强程序的可读性,以及标识符的灵活性,但它也有"非直观性"等缺点。

define的用法

#define为一宏定义语句,通常用它来定义常量,函数,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:

#define INT int
#define TRUE 1
#define Add(a,b) ((a)+(b));
#define Loop_10 for (int i=0; i<10; i++)

在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,可以参看。

typedef与#define的区别

  • typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名)不能定义函数,而#define原本在C中是为了定义常量或者简短函数,但后来渐渐地也可以为表标识符取别名了。
  • 特别注意的是,define的取别名(包括定义函数,变量等)只是简单的宏替换而已,也就是原地扩展,而typedf的取别名是真正意义上的取别名,从下面这个例子就可以看出来:
cpp 复制代码
#define X int*
typedef int* Y;

int main() 
{  
    X a, b; //等价于int* a,int b 
    Y c,d;   //等价于 int* c,int* d
}

因此取别名主张用typedef,一来在早期的许多C编译器中define取别名是非法的,只是现今的编译器又做了扩充。二来宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。

typedef陷阱

陷阱一:
记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。比如:
先定义:
typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);

const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。原因在于const给予了整个指针(也就是PSTR)本身以常量性,而不是只给char。
陷阱二:

typedef static int INT2; //不可行
编译将失败,会提示"指定了一个以上的存储类"。

相关推荐
Dxy123931021629 分钟前
python创建一个excel文件
开发语言·python·excel
朝朝又沐沐36 分钟前
算法竞赛阶段二-数据结构(40)数据结构栈的STL
开发语言·数据结构·c++·算法
程序猫.1 小时前
C语言 二分查找:高效搜索有序数组
c语言·算法
比特森林探险记1 小时前
Go语言常用的设计模式
开发语言·设计模式·golang
Antonio9151 小时前
【网络编程】WebSocket 实现简易Web多人聊天室
前端·网络·c++·websocket
深海潜水员1 小时前
【Unity】背包系统 + 物品管理窗口 (上)
开发语言·vscode·游戏·unity·c#·游戏引擎
晨非辰1 小时前
#C语言——刷题攻略:牛客编程入门训练(一):简单输出、基本类型
c语言·学习·学习方法·visual studio
德育处主任Pro2 小时前
p5.js 用 beginGeometry () 和 endGeometry () 打造自定义 3D 模型
开发语言·javascript·3d
kyranhan2 小时前
C#程序本地运行正常,通过网络下载报错:FileLoadException:“未能加载文件或程序集“xxx.dll”或它的某一个依赖项。
开发语言·c#·wpf