新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版用于讨论编程和软件设计的技巧
    [返回] 计算机科学论坛计算机技术与应用『 编程心得 』 → C语言中的typedef问题.(ZT) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 17869 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: C语言中的typedef问题.(ZT) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     enorm 帅哥哟,离线,有人找我吗?
      
      
      威望:4
      头衔:头衔
      等级:大三暑假(参加全国数模竞赛拿了一等奖)(版主)
      文章:144
      积分:854
      门派:Lilybbs.net
      注册:2005/12/1

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给enorm发送一个短消息 把enorm加入好友 查看enorm的个人资料 搜索enorm在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看enorm的博客楼主
    发贴心情 C语言中的typedef问题.(ZT)

    1. 基本解释
      typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类

    型(int,char等)和自定义的数据类型(struct等)。
     在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一

    些比较复杂的类型声明。

      至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。

    2. typedef & 结构的问题

      当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含

    指向它自己的指针吗?请你先猜想一下,然后看下文说明:

    typedef struct tagNode
    {
     char *pItem;
     pNode pNext;
    } *pNode;

      答案与分析:

      1、typedef的最简单使用

    typedef long byte_4;

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

      2、 typedef与结构结合使用

    typedef struct tagMyStruct
    {
     int iNum;
     long lLength;
    } MyStruct;

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

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

    struct tagMyStruct
    {
     int iNum;
     long lLength;
    };

      分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和

    tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

      我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义

    变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

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

    typedef struct tagMyStruct MyStruct;

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

      答案与分析

      C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数

    这样的例子,上述代码的根本问题在于typedef的应用。

      根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道

    pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,

    也就是说这个时候编译器根本不认识pNode。

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

      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;

    [此贴子已经被作者于2005-12-14 19:02:33编辑过]

       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    天亮了

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/14 18:11:00
     
     reallyh 帅哥哟,离线,有人找我吗?
      
      
      威望:4
      等级:大四(GRE考了1600分!)(版主)
      文章:114
      积分:1041
      门派:Lilybbs.net
      注册:2005/12/6

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给reallyh发送一个短消息 把reallyh加入好友 查看reallyh的个人资料 搜索reallyh在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看reallyh的博客2
    发贴心情 
    呵呵
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/14 18:40:00
     
     榛树叶 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:8
      积分:90
      门派:XML.ORG.CN
      注册:2006/7/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给榛树叶发送一个短消息 把榛树叶加入好友 查看榛树叶的个人资料 搜索榛树叶在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看榛树叶的博客3
    发贴心情 

    我的c语言书上根本没题typedef是怎么用的
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/28 10:07:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 编程心得 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/2 18:18:50

    本主题贴数3,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    5,093.750ms