C语言多文件
头文件卫士
作用:防止头文件内容重复定义
定义语法:
#ifndef 文件名做宏名(大写)
#define 文件名做宏名(大写)
//头文件内容
#endif
例如
hello.h
//如果没有定义__HELLO_H_,程序继续程序继续依次向下执行,如果已经定义当再次被包含gcc编译器直接将代码删除
#ifndef __HELLO_H_
#define __HELLO_H_
signed int g_a=200;
#endif
world.h
#ifndef __WORLD_H_
#define __WORLD_H_
#include "hello.h"
#endif
main.c
#include "hello.h"
#include "world.h"
int main(void){
return 0;
}
gcc -E -o main.i main.c
vim main.i
/*没有头文件卫士*/
//#include "hello.h
signed int g_a=200; //重复定义
//#include "world.h" 里面的#include "hello.h"
signed int g_a=200; //重复定义
/*有头文件卫士*/
//#include "hello.h"
signed int g_a=200;
//#include "world.h" 里面的#include "hello.h"
//#ifndef __HELLO_H_ 已经定义,不会再把hello.h的内容拷贝过来
头文件,源文件,主文件
A.头文件:负责变量的声明,自定义数据类型的声明和函数的声明
作用:将来别的源文件只需包含头文件即可访问变量和函数
B.源文件:负责变量的定义,自定义数据类型变量的定义,函数的定义
C.主文件:负责统领头文件和源文件,它里面只有main函数,它负责调用其他源文件变量和函数
D.一个源文件对应一个头文件,并且源文件包含自己对应的头文件
E.如果头文件中有相同的内容,建议摘出来之后放到一个公共的头文件中其他头文件只需要包含公共的头文件即可
注意:static关键字
例如
add.h //头文件
#ifndef __ADD_H_
#define __ADD_H_
extern void add(int *const,int *const);
#endif
add.c //源文件
#include "add.h"
void add(int *const pa,int *const pb){
*pa+*pb;
}
main.c //主文件
#include <stdio.h>
#include "add.h"
int main(void){
int a=100,b=200;
add(&a,&b);
printf("a=%d b=%d\n",a,b);
return 0;
}
Makefile
A.Makefile功能:能够制定编译规则,将来让gcc编译器根据这个规则来编译程序,Makefile本质就是一个文本文件,此文件给make命令使用,将来make命令会根据Makefile里面的编译规则让gcc编译程序
B.注意:Makefile注释用#
C.Makefile语法格式:
目标:依赖1,依赖2,依赖3…依赖N
(TAB键)编译命令1
(TAB键)编译命令2
…
(TAB键)编译命令N
(TAB键)还可以是其他命令:ls/cp/cd等
Makefile工作原理
当执行make命令时,make命令首先在当前目录下找Makefile,一旦找到Makefile文件,打开此文件并且遭到所有的编译规则,通过这些编译规则确定了最终的目标是可执行文件和源文件然后make命令首先在当前目录下找是否存在 目标文件可执行文件,如果可执行文件存在,然后检查可执行文件和源文件的时间戳那个更新,如果可执行文件的时间戳比源文件新,说明源文件没有修改过无需编译,提示文件最新,如果可执行文件的时间戳比源文件要旧,说明源文件修改过,根据编译规则的命令重新编译如果一开始没有找找可执行文件,程序整个重新编译
Makefile小技巧
%.o:%.c
(TAB键)gcc -c -o $@ $<
%.o:目标文件.o
%.c:源文件.c
$@:目标文件
$<:源文件
作用是将当前目录下所有的.c文件单独编译生成对应的.o目标文件