typedef与#define

来源:互联网 发布:爬虫数据分析 编辑:程序博客网 时间:2024/05/23 21:12

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  直接替换下,就发现了

0 0