c++中typedef和#define的区别
- 宏主要用于定义常量及书写复杂的内容;typedef主要用于定义类型别名。
- 宏替换发生在编译阶段之前(预处理阶段),属于文本插入替换;typedef是编译的一部分。
- 宏不检查类型;typedef会检查数据类型。
- 宏不是语句,不在在最后加分号;typedef是语句,要加分号标识结束。
- 注意对指针的操作,typedef char * p_char和#define p_char char *区别巨大。
第五点示例代码如下
#include<iostream>
#include<vector>
using namespace std;
#define int_ptr1 int*//预处理指令,结尾不用加封号
typedef int* int_ptr2;//语句,必须加封号。
int main(){
int a = 1000;
int_ptr1 p1, p2;//声明一个指针变量p1和一个整型变量p2
p1 = &a;//p1是int*类型
p2 = a;//p2是int类型
cout << *p1 << endl;//1000
cout << p2 << endl;//1000
cout << "----------------------------------------------"<< endl;
int b = 2000;
int_ptr2 p3, p4;//声明两个指针变量p3、p4
p3 = &b; //p3是int*类型
p4 = &b; //p4是int*类型
cout << *p3 << endl;//2000
cout << *p4 << endl;//2000
cout << "----------------------------------------------" << endl;
int c = 3000;
const int_ptr1 p5 = &a;
//const INTPTR1 p5是一个常量指针,即不可以通过p5去修改p5指向的内容,但是p5可以指向其他内容。
//*p5 = 250;//VS下报错:表达式必须是可修改的左值,证明是常量指针
int_ptr1 const p6 = &a;
//const INTPTR2 p6是一个指针常量,不可使p6再指向其他内容。
//因为INTPTR2表示一个指针类型,因此用const限定,表示封锁了这个指针类型。
//p6 = &c;
//VS下报错:表达式必须是可修改的左值,证明是指针常量
const int_ptr2 p7 = &b;
//const INTPTR2 p7是一个指针常量,不可使p7再指向其他内容。
//因为INTPTR2表示一个指针类型,因此用const限定,表示封锁了这个指针类型。
//p7 = &a;//VS下报错:表达式必须是可修改的左值,证明是指针常量
cout << *p7 << endl;//2000
int_ptr2 const p8 = &c;
//const INTPTR2 p8是一个指针常量,不可使p8再指向其他内容。
//因为INTPTR2表示一个指针类型,因此用const限定,表示封锁了这个指针类型。
//p8 = &b;//VS下报错:表达式必须是可修改的左值,证明是指针常量
cout << *p8 << endl;//3000
system("pause");
return 0;
}