typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间
#define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题.
区别的话,
#是宏,处理的时候位于编译前阶段,宏处理器基本上对你的C/C++程序不会有任何的感知。它只处理宏的语法。而编译阶段的“程序”得到的是宏处理完的结果。typedef是编译阶段的一部分。它的意义是单一的。你用宏来定义类型,只是它恰好替换完字符串,可以达到那样的效果。但没有任何措施能够阻止你用它干别的事情。比如,咱们来个坑爹的:#define PINT (int*)
void function_name PINT;
我进行了一个函数定义,它的参数是int*。因为宏替换的结果是这样:void function_name (int*);
从这个例子里,你应当能看出来宏的无脑替换的本质。它和C编译阶段的语法完全是脱节的,所以可以蹂躏出各种花样。typedef可以做非常不同的事情。比如,类型可以作为类/名字空间的一个成员。比如:template <int opengl_type_enum>
struct TypeHelper
{
};
template<>
struct TypeHelper<GL_UNSIGNED_INT>
{
typedef GLuint Type;
}
template<>
struct TypeHelper<GL_FLOAT>
{
typedef float Type;
}
//在使用的时候
TypeHelper<GL_FLOAT>::Type my_variable = 1.234;
实际上,在标准库里,你经常能看到:template <typename T>
class ContainerType
{
public:
typedef T value_type;
}
在用的时候,可以直接引用这个value_type,它会随着你的模板参数而改变。
作用域上,#define没有作用域限制,定义过的宏在之后的程序都可用;
typedef有自己的作用域(在定义函数内)
另外,对指针操作上做个补充
typedef int * pint;
#define PINT int *;
Int i1=1,i2=2;
const pint p1=&i1;//P不可改,P指向内容可改
const PINT p2=&i2;//P可改,P指向内容不可改
举一些额外的例子:
typedef int* int_p1;
int_p1 a, b, c; // a, b, and c are all int pointers.
#define int_p2 int*
int_p2 a, b, c; // only the first is a pointer!
typedef int a10[10];
a10 a, b, c; // create three 10-int arrays
typedef int (*func_p) (int);
func_p fp // func_p is a pointer to a function that
// takes an int and returns an int
#define 直接替换下,就发现了