C++ 宏定义和 typedef 的区别

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 宏定义和 typedef 的区别相关的知识,希望对你有一定的参考价值。

       宏定义#define为预处理指令,在编译处理时进行简单的文本替换,不作正确性检查,不关含义是否正确照样带入,只在编译已被展开的源程序时才会发现可能的错误并报错

  typedef为复杂的声明定义简单的别名。在自己的作用域内给一个已经存在的类型一个别名。

特点注意:

1:#define 不是语句 不要在行末加分号,否则 会连分号一块置换。

2:#define的原理是文本替换。#define定义时并不会真正去执行它所代表的东西,而是当真正在用到这个define的值时,会进行文本替换然后才执行

3:typedef是语言编译过程的一部分,但它并不实际分配内存空间


下面通过一段代码说明C++中这两者的区别和坑点~两个坑点:涉及指针类型和常量类型,需要注意

#include <iostream>
using namespace std;

int main(int argc,char** argv)

	#define INT_PTR int* //不加分号,前为替代类型
	#define MAX 5*5+8
	typedef int* int_ptr; //加分号,后为替代类型

	INT_PTR a,b;
	int_ptr c,d;//int_ptr变成了int指针类型的别名
	int* e,f;
	int g = MAX*MAX;

	//使用RTTI的typeid运算符的name()操作显示类型
	cout<<"a is :"<<typeid(a).name()<<endl;
	cout<<"b is :"<<typeid(b).name()<<endl;//非指针
	cout<<"c is :"<<typeid(c).name()<<endl;
	cout<<"d is :"<<typeid(d).name()<<endl;
	cout<<"e is :"<<typeid(e).name()<<endl;//非指针
	cout<<"f is :"<<typeid(f).name()<<endl;
	cout<<"g is :"<<g<<endl;
	cin.get();
	return 0;

RTTI的typeid运算符的name()操作显示类型,不知道的话在C++Primer第十九章,运行时类型识别小节


以上是关于C++ 宏定义和 typedef 的区别的主要内容,如果未能解决你的问题,请参考以下文章

typedef与define宏定义用于声明新的类型之间的区别

typedef关键字

C语言typedef详解

C++ typedef详解

typedef 和 #define 的区别

C++中宏替换与内联函数的区别