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

相关推荐
Wenweno0o几秒前
Ubuntu 系统配置 VS Code C++ 开发环境
数据库·c++·ubuntu
傻啦嘿哟几秒前
Python 实现 Excel 数据可视化:柱状图制作教程
开发语言·python
草莓熊Lotso2 分钟前
【Linux系统加餐】 mmap 文件映射全解:从底层原理、API 到实战开发(含 malloc 模拟实现)
android·linux·运维·服务器·c语言·c++
96772 分钟前
mybatis的作用+sql怎么写
java·开发语言·mybatis
深邃-5 分钟前
【C语言】-数据在内存中的存储(2):浮点数在内存中的存储
c语言·开发语言·数据结构·c++·算法·html5
十五年专注C++开发5 分钟前
Linux 下用 VS Code 高效调试(二)
linux·c++·windows·vscode
大鹏说大话8 分钟前
为.NET应用加速:从内存缓存到Redis的实战指南
开发语言
unityのkiven12 分钟前
如何通过DirectShow用C++实现多台PTZ相机的控制?
开发语言·c++·数码相机
csbysj202013 分钟前
XQuery 添加元素和属性
开发语言
梦游钓鱼14 分钟前
c++中单例模式(局部静态变量)
开发语言·c++·单例模式