C语言 如何在多文件中公用同一个结构体?

劉俊 2011-02-01 05:01:57
如何在多文件中公用同一个结构体?


这一个是define.h文件,有如下内容。

struct book
{
char bkname[20];
int num;
float price;
char author[20];
char state;
char borrower[20];
char sex;
int stunum;
struct book *next;
};


typedef struct book BOOK;



----------------分割线----------------------------------



现在在putin.c文件想引用这一个结构体,putin.c文件中有如下内容:

#include<stdio.h>
#include"define.h"
#include<stdlib.h>
static BOOK *creat(int n);

void putin()
{
int n;
printf("Please enter how many books you want to put in:");
while(!scanf("%d",&n))
{
printf("Sorry ,I only to know int value,Please enter again:");
}
BOOK *head; head=creat(n);
if(head!=NULL)
printf("输入成功.\n");
else
printf("输入失败。\n");
}


BOOK *creat(int n)
{
int i;
extern BOOK *h,*pre,*cur;
if((h=(BOOK *)malloc(sizeof(BOOK)))==NULL)
{
printf("分配内存空间失败.\n");
exit(1);
}
h->bkname[0]='\0';
h->num=0;
h->price=0;
h->author[0]='\0';
h->state='\0';
h->borrower[0]='\0';
h->sex='\0';
h->stunum='\0';
h->next=NULL;
pre=h;
for(i=1;i<=n;i++)
{
if((cur=(BOOK *)malloc(sizeof(BOOK)))==NULL)
{
printf("不能分配空间。\n");
exit(1);
}
pre->next=cur;
printf("请输入第%d本书的书名:",i);
gets(cur->bkname);
printf("请输入第%d本书的作者:",i);
gets(cur->author);
printf("请输入第%d本书的单价:",i);
scanf("%f",&cur->price);
printf("请输入第%d本书的序号:",i);
scanf("%d",&cur->num);
printf("请输入第%d本书的存在状态:",i);
cur->state=getchar();
printf("请输入第%d本书的借书人(或者置空.):",i);
gets(cur->borrower);
printf("请输入第%d本书借书人的性别(或者置空.):",i);
cur->sex=getchar();
printf("请输入第%d本书借书人的学号.(或者置空.)",i);
scanf("%d",&cur->stunum);
cur->next=NULL;
pre=cur;
}
return h;
}


------------------------------------------------------------------

为什么会编译错误呢?

错误信息有:

error C2275: 'BOOK' : illegal use of this type as an expression(指向红色那一句)

see declaration of 'BOOK'

error C2065: 'head' : undeclared identifier

warning C4047: '=' : 'int ' differs in levels of indirection from 'struct book *'

warning C4047: '!=' : 'int ' differs in levels of indirection from 'void *'



--------------------------------------分割线-----------------------------

针对以下错误,我做出如下修改:

将putin.c文件中的BOOK *head改为extern BOOK *head,但是结果依然不对。

错误信息变为:

error C2143: syntax error : missing ';' before 'type'(这一个错误就指在我刚刚修改的那一行)。

error C2065: 'head' : undeclared identifier

warning C4047: '=' : 'int ' differs in levels of indirection from 'struct book *'

warning C4047: '!=' : 'int ' differs in levels of indirection from 'void *'



-----------------------------------分割线-----------------------------

然后,我再去看一下FAQ,结果还是不能解决,所以想请大家帮忙看一下错在哪里。

-----------------------------------------------------------------------------------------------------

因为我想编一个简易版的图书馆管理系统,所以我希望我的所有函数都共用一个BOOK类型的结构体,所有的操作都是在同一个BOOK上进行,我应该怎么做?是不是如果在一个C文件包括了define.h文件,就不能在其他C文件包括它,只能用引用?不然的话会出现针对多个BOOK类型的操作?

谢谢。

...全文
2796 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
劉俊 2011-02-02
  • 打赏
  • 举报
回复
问题已解决,谢谢楼上各位。
arong1234 2011-02-01
  • 打赏
  • 举报
回复
少了关键字typedef[Quote=引用 2 楼 jixingzhong 的回复:]
引用 1 楼 arong1234 的回复:
C语言只允许在作用域的开头定义变量,你把定义放到函数开始就没问题了


比较喜欢这种形式:
struct _BOOK
{
。。。
struct _BOOK *next;
}BOOK;

另外,建议看看内存对齐相关的知识,优化struct的size。
[/Quote]
ningweidong 2011-02-01
  • 打赏
  • 举报
回复
看着就头大。
你把那个结构体定义成全局的,就可以公用了。
jixingzhong 2011-02-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
C语言只允许在作用域的开头定义变量,你把定义放到函数开始就没问题了
[/Quote]

比较喜欢这种形式:
struct _BOOK
{
。。。
struct _BOOK *next;
}BOOK;

另外,建议看看内存对齐相关的知识,优化struct的size。
arong1234 2011-02-01
  • 打赏
  • 举报
回复
C语言只允许在作用域的开头定义变量,你把定义放到函数开始就没问题了

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧