// 3)规范做法:
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode; 6. typedef 与 #define的问题
有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一点?
[c-sharp] view plaincopyprint
typedef char* pStr;
#define pStr char*;
typedef char* pStr;
#define pStr char*;
答案与分析:
通常讲,typedef要比#define要好,特别是在有指针的场合。
请看例子:
[c-sharp] view plaincopyprint
typedef char* pStr1;
#define pStr2 char * pStr1 s1, s2; // char* s1; char* s2;
pStr2 s3, s4; // char* s3, s4;即 char s4; typedef char* pStr1;
#define pStr2 char *
pStr1 s1, s2; // char* s1; char* s2;
pStr2 s3, s4; // char* s3, s4;即 char s4;
在上述的变量定义中,s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。
上例中define语句必须写成 pStr2 s3, *s4; 这这样才能正常执行。
7. typedef 与 复杂的变量声明
在编程(www.cppentry.com)实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:
下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请问该如何做?
[cpp] view plaincopyprint
int *(*a )(int, char*);
void (*b ) (void (*)());
double(*)() (*pa) ;
int *(*a )(int, char*);
void (*b ) (void (*)());
double(*)() (*pa) ; 答案与分析:
对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。
8. typedef 修饰函数指针
[cpp] view plaincopyprint
//1. 定义一个函数指针
typedef int(_cdecl *FUN_Start)(UCHAR);
/* typedef的功能是定义新的类型。定义这种类型为指向某种函数的指针,这函数以一个UCHAO为参数并返回int类型。*/
//2. 定义这个函数指针的一个变量
FUN_Start fun_Start;
//3. 把函数的地址赋给此函数指针
fun_Start = (FUN_Start)GetProcAddress(m_hLibrary,"Rec_SetDevice");
//4. 调用
if (fun_Start('a') == 1) //直接通过函数指针调用
{……}
//当然也可以这样
if ( (*)fun_Start('a') == 1) //先用*fun_start取出它所指的函数类型,再调用
{……}
//1. 定义一个函数指针
typedef int(_cdecl *FUN_Start)(UCHAR);
/* typedef的功能是定义新的类型。定义这种类型为指向某种函数的指针,这函数以一个UCHAO为参数并返回int类型。*/
//2. 定义这个函数指针的一个变量
FUN_Start fun_Start;
//3. 把函数的地址赋给此函数指针
fun_Start = (FUN_Start)GetProcAddress(m_hLibrary,"Rec_SetDevice");
//4. 调用
if (fun_Start('a') == 1) //直接通过函数指针调用
{……}
//当然也可以这样
if ( (*)fun_Start('a') == 1) //先用*fun_start取出它所指的函数类型,再调用
{……}因为函数名就是一个地址,该函数名所代表的函数的入口地址。
注:
总之一点,不要把typedef看成简单的替换,要看成一种新的命名,要与default相区别!!