[51单片机] C51下结构链表编译下出现出错误,请各路大侠高人指点一下

[复制链接]
1816|11
 楼主| freeworld001 发表于 2015-10-14 22:07 | 显示全部楼层 |阅读模式
最用keil C51环境下尝试实现链表结构,总是出现“subs”未定义的错误(如果把结构数组subs提到前面,就会出现“color”"taste"未定义的错误),可以我明明已经定义了,不知道是什么原因,(PS:这段链表结构声明不在主函数里面)链表声明如下:

#define 0 null
typedef struct aItem
{
    char * string;
    struct aItem * ParentLevel;
    struct aIem * ChildLevel;
}bItem;

bItem color[3] =
{
    {"black",subs,null},
    {"red",subs,null},
    {"blue",subs,null}
}

bItem taste[3] =
{
    {"bitterness",subs,null},
    {"sweet",subs,null},
    {"sour",subs,null}
}

bItem subs[2] =
{
     {"color",null,color},
     {"taste",null,taste},
}


是不是链表结构定义有问题,那么该如何定义,请各位高人指点一下
遗珠容似半生瓜 发表于 2015-10-14 23:22 | 显示全部楼层
在bItem color[3]之前声明subs就行了

  1. #define null 0

  2. typedef struct aItem
  3. {
  4.      char * string;
  5.      struct aItem * ParentLevel;
  6.      struct aItem * ChildLevel;
  7. }bItem;

  8. bItem subs[2];

  9. bItem color[3] =
  10. {
  11.      {"black",subs,null},
  12.      {"red",subs,null},
  13.      {"blue",subs,null}
  14. };

  15. bItem taste[3] =
  16. {
  17.      {"bitterness",subs,null},
  18.      {"sweet",subs,null},
  19.      {"sour",subs,null}
  20. };

  21. bItem subs[2] =
  22. {
  23.       {"color",null,color},
  24.       {"taste",null,taste},
  25. };
 楼主| freeworld001 发表于 2015-10-14 23:52 | 显示全部楼层
遗珠容似半生瓜 发表于 2015-10-14 23:22
在bItem color[3]之前声明subs就行了

非常感谢你的回复,加了subs声明,就会出现“subs重复定义”的错误(即使我把底下赋值前bItem去掉,依然存在),今天试一了天,感觉陷入了错误循环,知道出现了什么错误,可以不知道怎么去解这个环
ayb_ice 发表于 2015-10-15 06:33 来自手机 | 显示全部楼层
不用typedef试试
 楼主| freeworld001 发表于 2015-10-15 09:31 | 显示全部楼层

试过了,两种结构定义方式都试过了,效果是一样的
ayb_ice 发表于 2015-10-15 09:58 | 显示全部楼层
第一句
#define 0 null
就错了
ayb_ice 发表于 2015-10-15 10:03 | 显示全部楼层
freeworld001 发表于 2015-10-15 09:31
试过了,两种结构定义方式都试过了,效果是一样的

稍改动就可以了
#define null 0
typedef struct
{
    char * string;
    struct aItem * ParentLevel;
    struct aItem * ChildLevel;
}bItem;


extern bItem subs[2];
bItem color[3] =
{
    {"black",subs,null},
    {"red",subs,null},
    {"blue",subs,null},
};
bItem taste[3] =
{
    {"bitterness",subs,null},
    {"sweet",subs,null},
    {"sour",subs,null}
};

bItem subs[2] =
{
     {"color",null,color},
     {"taste",null,taste},
};
 楼主| freeworld001 发表于 2015-10-15 10:51 | 显示全部楼层
ayb_ice 发表于 2015-10-15 10:03
稍改动就可以了
#define null 0
typedef struct

按你方式还是会出现“重复定义”的错误,不过我尝试把 extern mItem subs 移到头文件里,就OK了,非常感谢你的帮助!!!
      另外我有疑问了,extern只是在外部文件需要访问本文件中的变量时,才会在头文件里面用extern把这个变量声明一下,而我这个链表只被本文件中的函数调用,外部并没有直接访问这个链表,只是调用了本文件中的函数,理解起来相当于只是间接访问了这个链表,现在通过extern声明方式解决了问题,这种情况是不是说明一个变量间接被外部访问也要用extern?
       但问题的起点是文件内部链表中结点单元所包含的指向上下结点指针出现未定义的现象,也就是说问题出现在文件内部,该如何理解?
ayb_ice 发表于 2015-10-15 11:07 | 显示全部楼层
freeworld001 发表于 2015-10-15 10:51
按你方式还是会出现“重复定义”的错误,不过我尝试把 extern mItem subs 移到头文件里,就OK了,非常感谢 ...

不要在头文件定义变量

我的这个本身就不是在头文件中修改的
ayb_ice 发表于 2015-10-15 11:08 | 显示全部楼层
freeworld001 发表于 2015-10-15 10:51
按你方式还是会出现“重复定义”的错误,不过我尝试把 extern mItem subs 移到头文件里,就OK了,非常感谢 ...

在使用之前要么已经定义要么外部声明
 楼主| freeworld001 发表于 2015-10-15 13:36 | 显示全部楼层
ayb_ice 发表于 2015-10-15 11:08
在使用之前要么已经定义要么外部声明

谢谢了,遇到怪事了,我把文件重新整理了一下,不用extern也行了,变正常了。
幸福至上 发表于 2015-10-16 00:16 | 显示全部楼层
楼主这个肯定编译会出错的,编译器在分析处理前面的color和taste数组时,并没有发现subs这个数组,因为subs在其后才被定义;同样,如果先定义并初始化subs,则color和taste数组还没定义,即是如@ayb_ice所说的问题,要使用的变量需要之前先被定义或被声明。所以应该在使用typedef定义了bItem后,就立即定义:bItem subs[2],以便后面的color和taste能够指向正确的位置,最后再对subs数组成员进行初始化,此时只能一个一个进行,而不能如同定义数组时那样给成员:subs[2]={{xxxx},{xxxx}};而在.h文件中使用extern先声明就可以了,请注意extern变量的意义以及编译器对其的处理方式。如果变量仅在文件内部使用,应该使用static声明。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部