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

typedef的用法

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

typedef int INT;
typedef int ARRAY10;
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; //不可行
编译将失败,会提示"指定了一个以上的存储类"。

相关推荐
绝世唐门三哥5 小时前
vue3中页面返回时刷新首页的处理方案
开发语言·前端·javascript
nianniannnn5 小时前
c++复习自存--流、异常处理、多线程与C++工程规范
开发语言·c++
geovindu5 小时前
CSharp: Dijkstra Algorithms
开发语言·后端·算法·c#
XR1234567885 小时前
食品饮料与制药行业GMP合规网络建设:无尘车间的网络不能成为污染源
开发语言·网络·php
学逆向的6 小时前
汇编——位运算
开发语言·汇编·算法·网络安全
zhangjw346 小时前
第29篇:Java伪共享与对象分配:并发性能优化的关键
java·开发语言·性能优化
hai3152475436 小时前
九章编译法----空间几何统一编译法
网络·汇编·人工智能·线性代数
xu_wenming6 小时前
Zephyr上开发 BLE(低功耗蓝牙)入门应用
c语言·嵌入式硬件·物联网
知无不研6 小时前
缺省参数与缺省函数的区别
c++·语法
Java面试题总结6 小时前
Python 开发技巧 · 高级装饰器 —— 从基础到工业级实战
开发语言·python