gcc 编译c的多文件程序问题

菜鸟学习linux下C编程不太理解多文件编译问题,写了个实例,请高手指点.写了一个链表的操作程序,包括主函数文件main.c,链表创建函数文件creat.c打印函数文件p... 菜鸟学习linux下C编程不太理解多文件编译问题,写了个实例,请高手指点.
写了一个链表的操作程序,包括主函数文件main.c,链表创建函数文件creat.c
打印函数文件print.c删除函数文件del.c,添加函数文件insert.c.
代码如下:
主函数文件main.c
#include<stdio.h>
main()
{
struct student *head,stu;
long del_num;
printf("input records:\n");
head=creat();
print(head);
printf("\n input the deleted number:\n");
scanf("%ld",&del_num);
head=del(head,del_num);
print(head);
printf("\n input the inderted record:");
scanf("%ld,%f",&stu.num,&stu.score);
head=insert(head,&stu);
print(head);
}

链表建立文件creat.c
#include<stdio.h>
#define NULL 0
#define LEN sizeof(struct student)
struct student
{
long num ;
float score;
struct student *next;
};
int n;
struct student *creat(void)
{
struct student *head;
struct student *p1,*p2;
n=0;
p1=p2=(struct student *)malloc(LEN);
printf("输入学号,成绩\n");
scanf("%ld,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student*)malloc(LEN);
scanf("%ld,%f",&p1->num,&p1->score);
}
p2->next=NULL;
return (head);
}

删除函数文件

struct student *del(struct student *head,long num)
{
struct student *p1,*p2;
if(head==NULL)
{printf("\nlist null! \n");goto end;}
p1=head;
while(num!=p1->num&&p1->next!=NULL)
{p2=p1;p1=p1->next;}
if(num==p1->num)
{if(p1==head) head=p1->next;
else p2->next=p1->next;
printf("delete:%ld\n",num);
n=n-1;
}
else
printf("%ld not been found! \n",num);
return(head);
}

插入文件insert.c
#include<stdio.h>
struct student *insert(struct student *head,struct student *stud)
{
struct student *p0,*p1,*p2;
p1=head;
p0=stud;
if(head==NULL)
{head=p0;p0->next=NULL;}
else
{while((p0->num>p1->num)&&(p1->next!=NULL))
p2=p1;
p1=p1->next;
if(p0->num<=p1->num)
{if(head==p1) head=p0;
else p2->next=p0;
p0->next=p1;

}
else
{
p1->next=p0;p0->next=NULL;

}

}
n=n+1;
return(head);
}

打印函数文件
print.c
#include<stdio.h>
void print(struct student *head)
{
struct student *p;
printf("\nNow,These %d records are :\n",n);
p=head;
if(head!=NULL)
do
{
printf("%ld %5.1f\n",p->num,p->score);
p=p->next;
}while(p!=NULL)
}
问题:
1各函数文件是相互独立的,怎样添加代码使之能够关联编译成功?
2使用GCC编译的话具体的编译命令?
展开
 我来答
樱凌准
2010-04-26 · TA获得超过243个赞
知道小有建树答主
回答量:259
采纳率:0%
帮助的人:263万
展开全部
不怕麻烦的话呢,可以调整#include结构来让各c文件相连。。
建议呢,把类型与函数的声明整理到特定的.h文件中,然后用#ifndef来使其只被包含一次,然后,在用到其它文件中实现的函数的时候将相应的.h文件include进来就好。这样呢,编译的时候可以单个文件逐一编译:
gcc -c main.c -o main.o
gcc -c del.c -o del.o
gcc -c insert.c -o insert.o
参数-c意思是只编译不连接,-o是名命输出文件。
全部编译成.o文件无误后,再将所有的.o文件相连:
gcc main.o del.o insert.o -o prog
就可以生成prog了。

然后举个例子说明处理.h文件:
比如这个create.c。里面定义了一个struct和一个函数。那么就可以写create.h如下:

#ifndef __CREATE_H__
#define __CREATE_H__
struct student
{
long num ;
float score;
struct student *next;
};
struct student *creat(void);
#endif

然后呢,因为student这个struct在这个.h文件里已经声明了,所以create.c里只要写#include "create.h",而在用到这个struct或者这个函数的场合,也只要这样简单一句就可以了。而.h文件开头的#ifndef可以保证同一个h文件不会被多次包含。当然,如果编译器支持的话,用#pragma once也许会比#ifndef更省事一些。

以上。
塞斯克小法
2010-04-26 · TA获得超过415个赞
知道小有建树答主
回答量:383
采纳率:0%
帮助的人:178万
展开全部
非常同意 樱凌准的做法,补充一点,再main.c里也要添加#include "creat.h"等头文件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冬日狂想曲
2010-04-26 · TA获得超过225个赞
知道小有建树答主
回答量:163
采纳率:0%
帮助的人:114万
展开全部
gcc a.c b.c c.c d.c -o abcd
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式