对于小型代码而言,可以将所有的文件写到一个源文件中。但是对于一个大的项目工程,代码量极大,如果把所有的源码都放在一个源文件,就会显得代码杂乱,不利于阅读,更不便于代码的修改和维护。这时候我们需要合理的组织代码,可以使用多个文件,把源码归类放到不同的文件中。
程序多文件一般分为两类:
1、头文件(.h):像我们常用的stdio.h,stdlib.h....这些都是C为我们提供的
2、源文件(.c):一般一个头文件,对应一个.c文件。
先说下自定义的头文件:
头文件中一般包括
(1)头文件区:包含源码所需的头文件,例如stdio.h,stdlib.h等。
(2)全局宏区:定义模块公用的宏(#define),例如缓冲区的大小。
(3)全局变量区:所有模块共用的变量(非static)。
(4)函数接口区:包含所有相关模块的函数接口。
源文件:
源文件就是头文件对应的那个.c文件,它一般包括函数的具体实现。
下面以一个操作链表的程序为例,具体说明多文件的用法及编译方法
首先定义一个头文件link.h
//start link.h
#include
#include //所有模块所需的头文件
struct node //节点结构体
{
int data;
struct node *next;
};
typedef struct node * Node; //为了简化代码,我们将节点指针变量用Node代替
extern Node head; //链表头,extern的作用是引用外部文件中的Node head
//链表的操作函数(接口)
extern int insert(int d);
extern int del(int d,Node *res);
extern void print();
extern void destory();
//end link.hlink.c 文件定义所有的操作链表的函数
//start link.c
#include "link.h" //包含自定义的link.h
Node head; //链表的头结点
int insert(int d)
{
Node p=NULL,q=NULL;
p = head;
if(p!=NULL)
{
while(p->next!=NULL)
{
p = p->next;
}//查找尾结点
}
q = (Node)malloc(sizeof(struct node));
if(q==NULL)
return -1;
q->next=NULL;
q->data = d;
if(p==NULL) //如果是空链表
{
head = q;
return 1;
}
p->next = q;
return 1; //插入成功返回1
}
int del(int d,Node *res)
{
Node p=NULL,q=NULL;
p = head;
if(p==NULL) //如果是空表返回-1
return -1;
if(p->data==d)
{
*res = p;
head = p->next;
return 1;
} else if(p->next==NULL)
return -1;
q = p;
p = p->next;
while(p!=NULL)
{
if(p->data!=d)
{
q = p;
p = p->next;
}else
{
q->next = p->next;
p->next = NULL;
*res = p;
return 1;
}
}
return -1;
}
void print()
{
Node p = head;
while(p!=NULL)
{
printf("%d\n",p->data);
p = p->next;
}
}
void destory()
{
Node p=NULL;
while(head!=NULL)
{
p = head->next;
free(head);
head = p;
}
head = NULL;
}
//end link.cmain.c 里面包含了整个程序的main函数,程序执行的入口
//start main.c
#include "link.h"
int main(void)
{
Node p;
int i;
for(i=1;i<8;i++)
insert(i);
print();
printf("destory......\n");
destory();
return 0;
}以上就是全部文件
多文件的编译方法:
gcc -o 生成的可执行文件 源文件1 源文件2...
如果要编译的文件较多可以使用通配符*
gcc -o 生成的可执行文件 *.c
给大家推荐一个Windows版的gcc,TDM-gcc,它的使用和linux系统上的gcc完全一样,使用的命令行模式
,非常好用,下载地址:
http://tdm-gcc.tdragon.net/download
对于本例,编译命令为:
gcc link.c main.c -o main
运行main
./main
输出结果为:
1
2
3
4
5
6
7
destory......
需要注意的是C++与C语言的多文件并不相同,c++头文件中一般放的是类的定义,格式如下
#ifndef _***_H_
#define _***_H_
//类的定义
#endifC++ .cpp 文件中一般放的是类的实现