设为首页 加入收藏

TOP

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

  1. typedef 最简单使用

  [c-sharp] view plaincopyprint

  typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4

  typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4

  你可以在任何需要 long 的上下文中使用 byte_4.注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。

  2. typedef 修饰数组

  [cpp] view plaincopyprint

  typedef char mySizes[100];

  mySizes xxx;

  typedef char [100] mySizes; //error

  typedef char mySizes[100];

  mySizes xxx;

  typedef char [100] mySizes; //error

  这里 mySize 就是一个大小为100的 char 数组,sizeof(mySize) 为 100.

  3. typedef 修饰指针

  [c-sharp] view plaincopyprint

  typedef char * pstr;

  int mystrcmp(pstr, pstr);

  ……

  int mystrcmp(const pstr, const pstr); //error

  typedef char * pstr;

  int mystrcmp(pstr, pstr);

  ……

  int mystrcmp(const pstr, const pstr); //error

  这里有一个 typedef 陷阱。标准函数 strcmp()有两个'const char *'类型的参数。因此,它可能会误导人们象上面这样声明。

  按照顺序,'const pstr'被解释为'char * const'(一个指向 char 的常量指针),而不是'const char *'(指向常量 char 的指针)。

  其实这点很好理解,const 就是修饰 pstr 指针的,并不是简单替换。

  这个问题很容易解决:

  [c-sharp] view plaincopyprint

  typedef const char * cpstr;

  int mystrcmp(cpstr, cpstr); // 现在是正确的

  typedef const char * cpstr;

  int mystrcmp(cpstr, cpstr); // 现在是正确的

  4. typedef 修饰结构体

  [c-sharp] view plaincopyprint

  typedef struct tagMyStruct

  {

  int iNum;

  long lLength;

  } MyStruct;

  typedef struct tagMyStruct

  {

  int iNum;

  long lLength;

  } MyStruct;

  这语句实际上完成两个操作:

  (1)。定义一个新的结构类型

  [c-sharp] view plaincopyprint

  struct tagMyStruct

  {

  int iNum;

  long lLength;

  };

  struct tagMyStruct

  {

  int iNum;

  long lLength;

  };

  分析:

  tagMyStruct ,实际上是一个临时名字,struct 关键字和 tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

  我们可以用 struct tagMyStruct xxName 来定义变量,但要注意,使用tagMyStruct xxxrName 来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

  (2)。 typedef 为这个新的结构起了一个名字,叫 MyStruct.

  typedef struct tagMyStruct MyStruct;因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。

  5. typedef & 结构的问题

  在结构中包含指向它自己的指针

  [c-sharp] view plaincopyprint

  typedef struct tagNode

  {

  char *pItem;

  pNode pNext; // error

  } *pNode;

  typedef struct tagNode

  {

  char *pItem;

  pNode pNext; // error

  } *pNode;

  答案与分析:

  根据我们上面的阐述可以知道:要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字 pNoed 也还不存在,也就是说这个时候编译器根本不认识pNode.

  解决这个问题的方法有多种:

  [cpp] view plaincopyprint

  // 1)

  typedef struct tagNode

  {

  char *pItem;

  struct tagNode *pNext;

  } *pNode;

  // 2)

  typedef struct tagNode* pNode;

  struct tagNode

  {

  char *pItem;

  pNode pNext;

  };

  //注意:在这个例子中,你用 typedef 给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

  // 3)规范做法:

  struct tagNode

  {

  char *pItem;

  struct tagNode *pNext;

  };

  typedef struct tagNode *pNode;

  // 1)

  typedef struct tagNode

  {

  char *pItem;

  struct tagNode *pNext;

  } *pNode;

  // 2)

  typedef struct tagNode* pNode;

  struct tagNode

  {

  char *pItem;

  pNode pNext;

  };

  //注意:在这个例子中,你用 typedef 给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

   

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

评论

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