C语言 多文件程序

在一个单独的目录中编写一个大型程序,行程一个.h和.c文件集,每个.c文件含有一个或多个函数定义.按需要重新编译每个.c文件,这样可节省时间.

假设我们正在开发一个pgm的大程序,在每一个.c文件的头部都含有一条
#include "pgm.h"
当处理器遇到这条命令时,它首先在当前的目录中寻找文件pgm.h.如果存在这个文件,就引入它;如果不存在,预处理器就在与机器相关的目录中寻找它;如果找不到pgm.h,预处理器就会给出一个错误信息,停止编译.

头文件中,可以包含#include和#define,枚举类型声明,结构类型声明,函数原型列表.这样头文件包含了所需要的所有程序元素.由于头文件出现在每一个.c文件的头部,它是把程序结合在一起的胶水.

这里写图片描述

事例

主文件名和头文件要对应上.

gcc编译的时候把三者一块作为参数填进去就行了

主文件名:test.c

#include <stdio.h>
#include "test.h"
int main(){
	int a = 5, b = 10;
	int result = add(a, b); // 函数的调用

	printf("result = %d\n", result);
	getchar();
	return 0;
}

被调用文件名:add_tool.c

// 函数的定义
#include "test.h"
int add(int x, int y){
	return x + y;
}

头文件名:test.h

#pragma once
//头文件在编译时会将其内容(引入的系统库和自己的库)复制到主文件中
//1.函数与变量的声明
//2.系统库的调用(好像不行)
int add(int x, int y); // 函数的声明,分号不能省略

其他

参考:https://www.cnblogs.com/chengjian-physique/p/9835924.html

  1. 函数可以多个声明,只能一处定义
  2. 原则上要先声明函数,再实现函数(这样函数实现即使在调用之后也没关系),如果函数定义在调用之前(定义,就包含了声明)
  3. .h文件声明函数后,编译器会在所有的.c文件里面寻找是否有.h文件里声明的函数,所以.h和.c可以不重名
  4. 引入.h文件本质就是复制了.h文件的内容,放在.c文件中

test.h

int add(int x, int y); // 函数的声明,分号不能省略

main

#include <stdio.h>
#include "test.h"
int main(){
	int a = 5, b = 10;
	int result = add(a, b); // 函数的调用
	printf("result = %d\n", result);
	getchar();
	return 0;
}

mian.c#include "test.h"中的相当于

#include <stdio.h>
int add(int x, int y); // 直接赋值过来
int main(){
	int a = 5, b = 10;
	int result = add(a, b); // 函数的调用
	printf("result = %d\n", result);
	getchar();
	return 0;
}
  1. 双引号和尖括号引用
    1. 双引号括起来的文件名,编译器会在本地查找文件,如果加上目录文件名,编译器就会在相对路径下寻找
    2. 尖括号括起来的文件名,编译器在标准库里找,在unix系统中,头文件一般放在/usr/local/include/usr/include这些地方

参考:https://blog.csdn.net/weixin_40763897/article/details/87181359

  1. .h文件是头文件,内含函数声明、宏定义、结构体定义等内容
  2. .c文件是程序文件,内含函数实现,变量定义等内容。
  3. //a.h void foo(); //a.c #include "a.h"库.c文件包含.h文件是否多余?
    xx.h 其实只是让需要写 xx.c 中函数声明的地方调用(可以少写几行字),至于 include 这个 .h 文件是谁,是 .h 还是 .c,还是与这个 .h 同名的 .c,都没有任何必然关系。
    虽然这样宏替换后出现了很多无用的声明,反正多些声明(.h一般只用来放声明,而放不定义)也无害处,又不会影响编译
    这个例子中显然是多余的。但是如果.c中的函数也需要调用同个.c中的其它函数,那么这个.c往往会include同名的.h这样就不需要为声明和调用顺序而发愁了

参考:
https://www.cnblogs.com/chengjian-physique/p/9835924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值