C语言多文件

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目标文件

C语言结构体,联合体,枚举

复合数据类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值