由于在C语言中,不能把所有的代码都放在一个.c文件里面,这样这个.c文件会很大,而且代码维护起来会很麻烦。
于是在网上找了些C语言多文件编程的示例,记录下我的学习过程。
我们可以把我们的代码按功能进行划分,一些源文件存放函数的实现,一些头文件声明这些函数,这样代码会更有条理。
头文件的大致格式:(注意,头文件中一般只能有申明,不能有定义,否则会出现重定义错误——multiple definition of。。。)
#ifndef _ABC_H_
#define _ABC_H_
//以上代码是为了防止这个头文件被多次包含,确保名字唯一
//宏定义
#define _MAX 100
//结构体声明
typedef struct{
int a;
}ABC;
//函数声明
extern void abcfun(void);
...
#endif
在写头文件的时候,有一点需要特别的注意,(一般情况下)定义不能放在头文件里面,需要放在一个单独的c文件里面,头文件里面只能有一个申明,如: extern Type A。
要对以上要求进行解释,我们需要了解编译的过程:
编译的第一步是把所有的CPP文件编译成为点O文件,而且每一个点CPP文件都是单独编译的,该点CPP文件中用到的类型必须在它所include 的头文件当中找到,相当于把它所有include的文件中的代码都加到该CPP文件的前面,
但是声明的部分将不会出现在编译后的点O文件,相当于每个 CPP文件都是单独编译,因此它的ifndef在一个文件里是没有用的,两个CPP文件里如果包含同一个有ifndef的头文件,效果是两个CPP文件都 把该头文件加到它的前面,但不会把声明的部分放到点O文件中,而会把头文件中定义的部分都输出到编译后的点O文件当中,因此如果在头文件当中有一个定义,那么如果有两个CPP文件当中include了它,那么将会出现重定义错误,multiple definition of
接下来介绍下多文件编程的小例子
功能:在main.c里面调用其他两个源文件里面的函数,然后输出字符串。
1、main.c
#include"mytool1.h"
#include"mytool2.h"
int main(int argc,char* argv[])
{
mytool1_printf("hello.");
mytool2_print("hello");
return 1;
}
2、 mytool1.h mytool1.c
//mytool1.h
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_printf(char* print_str);
#endif
//mytool1.c
#include"mytool1.h"
#include<stdio.h>
void mytool1_printf(char* print_str)
{
printf("This is mytool1 print %s\n",print_str);
}
3、 mytool2.h mytool2.c
//mytool2.h
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_h
void mytool2_print(char* print_str);
#endif
//mytool2.c
#include "mytool2.h"
#include<stdio.h>
void mytool2_print(char* print_str)
{
printf("This is mytool2 print %s\n",print_str);
}
在linux下,把这几个文件放在同一个目录下,然后在shell中输入
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc main.o mytool1.o mytool2.o -o main
就可以生成可执行文件 main
关于 Makefile
如果项目中的源文件改动一次,那项目就要重新编译一次,这样会很麻烦。一个Makefile文件就可以解决这个问题。Makefile文件里面存在编译的指令,这样源文件改变一次,我们只要重新Make一下,项目就会编译好,会很方便。
cc=gcc target=main obj=main.o mytool1.o mytool2.o $(target):$(obj) $(cc) $(obj) -Wall -o $(target) main.o:main.c $(cc) -c main.c mytool1.o:mytool1.c $(cc) -c mytool1.c mytool2.c:mytool2.c $(cc) -c mytool2.c .PHONY:clean $(RM) *.o $(target)
引用:
http://blog.163.com/m13591120447_1/blog/static/21637918920132365724538/
http://soft.chinabyte.com/os/12/11584512.shtml