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

相关推荐
IT永勇11 分钟前
数据结构-栈
c语言·数据结构·嵌入式开发
C嘎嘎嵌入式开发12 分钟前
python之set详谈
开发语言·python
定偶13 分钟前
进制转换小题
c语言·开发语言·数据结构·算法
真的想上岸啊32 分钟前
学习C++、QT---21(QT中QFile库的QFile读取文件、写入文件的讲解)
c++·qt·学习
小庞在加油1 小时前
Apollo源码架构解析---附C++代码设计示例
开发语言·c++·架构·自动驾驶·apollo
森焱森1 小时前
60 美元玩转 Li-Fi —— 开源 OpenVLC 平台入门(附 BeagleBone Black 驱动简单解析)
c语言·单片机·算法·架构·开源
专注VB编程开发20年1 小时前
各版本操作系统对.NET支持情况(250707更新)
开发语言·前端·ide·vscode·.net
我喜欢就喜欢2 小时前
RapidFuzz-CPP:高效字符串相似度计算的C++利器
开发语言·c++
千帐灯无此声2 小时前
Linux 测开:日志分析 + 定位 Bug
linux·c语言·c++·bug
莫彩2 小时前
【Modern C++ Part7】_创建对象时使用()和{}的区别
开发语言·c++