打印
[STM8]

请大家帮忙看看这种结构体指针定义使用有什么问题

[复制链接]
5035|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wqz|  楼主 | 2013-12-6 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下:
struct stuTest{
   unsigned char  stu1[10];
   unsigned char  stu2[11];       
   unsigned char  stu3[5];
   unsigned char  stu4[5];
};   
struct stuTest Testl;
struct stuTest *pStu;
pStu=&Testl;

在IAR for STM8 上编译,无法通过。请大家帮忙看看问题出在那里?

Error[Pe077]: this declaration has no storage class or type specifier
Error[Pe147]: declaration is incompatible with "struct stuTest *__near pStu" (declared at line 66)
Error[Pe144]: a value of type "struct stuTest *" cannot be used to initialize an entity of type "int"
沙发
wqz|  楼主 | 2013-12-6 16:05 | 只看该作者
从网络上搜个代码拷贝进去,也是出现同样的错误:
struct student
{
        char name[20];
        int num;
};
struct student stu1,stu2;
struct student *p;
p=&stu1;

使用特权

评论回复
板凳
feilusia| | 2013-12-6 16:21 | 只看该作者
这两句
struct stuTest *pStu;
pStu=&Testl;

改成
struct stuTest *pStu = (stuTest *)Testl ;

试试

使用特权

评论回复
地板
feilusia| | 2013-12-6 16:22 | 只看该作者
另外这些定义的语句不能放在头文件,必须要放在.c的文件里。如果头文件要声明,需要加extern.

使用特权

评论回复
5
wqz|  楼主 | 2013-12-6 16:40 | 只看该作者
将代码放到main.c里,并修改了,还是不行。

使用特权

评论回复
6
feilusia| | 2013-12-6 17:09 | 只看该作者
wqz 发表于 2013-12-6 16:40
将代码放到main.c里,并修改了,还是不行。

先写一个定义结构体的、把定义结构体指针的先注释掉,编译下能不能过。

使用特权

评论回复
7
wqz|  楼主 | 2013-12-6 17:13 | 只看该作者
按下面那样就可以通过编译:
struct stuTest{
   unsigned char  stu1[10];
   unsigned char  stu2[11];       
   unsigned char  stu3[5];
   unsigned char  stu4[5];
};   
struct stuTest Testl;
struct stuTest * pStu;

使用特权

评论回复
8
feilusia| | 2013-12-6 17:16 | 只看该作者
wqz 发表于 2013-12-6 17:13
按下面那样就可以通过编译:
struct stuTest{
   unsigned char  stu1[10];

把最后一句改成struct stuTest *pStu = (struct stuTest *)Testl ;试试

使用特权

评论回复
9
kenmy| | 2013-12-6 17:18 | 只看该作者
你用一个typedef 重命名结构体,然后你给该类型的结构体变量定义类型就直接用重命名的名字就好了,而不用跟着struct,如下修改参考
typedef struct {
   unsigned char  stu1[10];
   unsigned char  stu2[11];        
   unsigned char  stu3[5];
   unsigned char  stu4[5];
}stuTest;
stuTest Testl;
stuTest *pStu;
pStu=&Testl;

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
fzy_666 + 4 赞一个! 我也是这么干的!
10
ar_m_cu| | 2013-12-6 17:20 | 只看该作者
本帖最后由 ar_m_cu 于 2013-12-6 17:22 编辑

我用keil编译没问题啊,在IAR for ARM中编译也没有问题

使用特权

评论回复
11
wqz|  楼主 | 2013-12-6 17:20 | 只看该作者
feilusia 发表于 2013-12-6 17:16
把最后一句改成struct stuTest *pStu = (struct stuTest *)Testl ;试试

这种试过不行的

使用特权

评论回复
评论
李冬发 2013-12-7 06:49 回复TA
struct stuTest *pStu = (struct stuTest *)Testl ---------------------- 这句肯定是错的,漏了个求地址的操作符'&' 
12
wqz|  楼主 | 2013-12-6 17:21 | 只看该作者
kenmy 发表于 2013-12-6 17:18
你用一个typedef 重命名结构体,然后你给该类型的结构体变量定义类型就直接用重命名的名字就好了,而不用跟 ...

一样的错误提醒

使用特权

评论回复
13
wqz|  楼主 | 2013-12-6 17:23 | 只看该作者
我在IAR for STM8 上进行编译无法通过,朋友们也可以试试看是否可以!

使用特权

评论回复
14
wqz|  楼主 | 2013-12-6 17:24 | 只看该作者
版本是:IAR Embedded Workbench for STMicroelectronics STM8 1.31

使用特权

评论回复
15
wqz|  楼主 | 2013-12-6 17:26 | 只看该作者
反复的看,好像语句并没有什么问题,是否编译器需要做设置?

使用特权

评论回复
16
huanben| | 2013-12-6 18:09 | 只看该作者
struct stuTest Testl;
struct stuTest *pStu;
指针pStu和对象Testl是不同的类型,虽然同时使用struct stuTest声明。C与指针这本书里有说明。

:lol好久没写代码,上述论断仅作参考,以书本为准。

使用特权

评论回复
17
puchuang| | 2013-12-6 18:25 | 只看该作者
没有怎么接触过这一块   楼主   帮你顶一个吧   自己钻研钻   应该能出来吧

使用特权

评论回复
18
wqz|  楼主 | 2013-12-6 22:02 | 只看该作者
huanben 发表于 2013-12-6 18:09
struct stuTest Testl;
struct stuTest *pStu;
指针pStu和对象Testl是不同的类型,虽然同时使用struct stuTe ...


《C和指针》的196页确实有类似描述,但指的是两个匿名的结构体。

使用特权

评论回复
19
huanben| | 2013-12-6 22:14 | 只看该作者
wqz 发表于 2013-12-6 22:02
《C和指针》的196页确实有类似描述,但指的是两个匿名的结构体。

书本有从文字上声明:只有匿名结构体才会这样吗?

使用特权

评论回复
20
sfesdm| | 2013-12-6 22:37 | 只看该作者
MDK下编译没问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

wqz

12

主题

117

帖子

2

粉丝