设为首页 加入收藏

TOP

c/c++中typedef详解(五)
2013-02-19 13:02:42 来源: 作者: 【 】 浏览:1373
Tags:c/c typedef 详解

 

  // 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相区别!!

      

首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言字符串用指针处理字符串 下一篇对于C语言可移植性的思考

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: