C++#define和typedef的区别

C++#define和typedef的区别

1.typedef用法

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

typedef int INT; // 标识符在前,有分号
typedef int* pINT;

2.#define用法

#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),也可以是标识符关键字等,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了。其本质是替换的功能

#define INT int
#define PI 3.14 //无分号,因其并非严格意义上的语句,宏名称一般大写

3.#define与typedef的区别

1.宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能
Eg: typedef (int*) pINT;
#define pINT2 int*
pINT a,b;的效果同int *a; int *b;表示定义了两个整型指针变量。而pINT2 a,b;的效果同int *a, b;表示定义了一个整型指针变量a和整型变量b。

  1. typedef常用于标识符的定义,#define常用于常量的定于(C遗传下来的)

4.typedef的特殊用途

1.定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:
char* pa, pb; // 它只声明了一个指向字符变量的指针 和一个字符变量;
以下则可行:
typedef char* PCHAR; // 一般用大写
PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针

2.用在旧的C代码中,声明struct新对象时,必须要带上struct。
typedef struct Student
{
int x;
int y;
}STU;

STU p1; // 这样就比原来的方式少写了一个struct,比较省事

在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。

3.用typedef来定义与平台无关的类型。
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
在连 double 都不支持的平台三上,改为:
typedef float REAL;
也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。
标准库就广泛使用了这个技巧,比如size_t。
另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。

5.typedef的用法陷阱

1.当const和typedef一起出现时,typedef不是简单的字符串替换。

#include
using namespace std;
typedef int * INT;

int main()
{
int a = 10;
int b = 20;

const INT c = &a;//变成指针常量了
*c = 100;//可以这样操作
//c = &b;//错误

const int * d = &a;//常量指针
//*d = 100;//错误
d = &b;

system("pause");
return 0;

}
2. typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:
typedef static int INT2; //不可行
编译将失败,会提示“指定了一个以上的存储类”。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值