一,声明定义
在数学界中,函数的使用一般有其固定架构,如一次函数,二次函数等。他们均有其一般形式,通过一般式方能够在后期灵活套用。而在C语言中,函数一样如此。
我们在调用某些函数时,需要先声明,以此证明该函数存在,编译器才能够读懂,从而不会报错。无论是自定义函数还是库函数均是如此(库函数的声明由编译器/标准库提供,开发者无需自己编写,只需引入头文件就能调用,头文件的本质就是集中存放函数声明、宏定义、结构体的文件)。
1.函数的声明:是在告诉编译器,有一个函数叫什么,参数是什么,返回类型是什么,函数是存在的
2.在函数的声明中,参数的名字可以不写
为了能够更好的理解函数的声明和定义关系,在这里,我们以判断闰年为例,写一段代码:
#include<stdbool.h>
#include<stdio.h>
bool is_leap_year(int y);//此处省略参数名
int main()
{
int year = 0;
scanf("%d", &year);
if (is_leap_year(year))//函数的调用
printf("闰年\\n");
else
printf("平年\\n");
return 0;
}
bool is_leap_year(int y)//函数的调用
{
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
return true;
else
return false;
}
由上述代码不难看出,bool is_leap_year(int y);为函数的声明,最后一段函数为函数的定义,是函数主体的处理逻辑(头文件可以看作为库函数的声明)。
当然,若无函数的声明也可以,只要把函数的定义写在前就行。
#include<stdbool.h>
#include<stdio.h>
bool is_leap_year(int y)//函数的定义
{
if (((y % 4 == 0) && y % 100 != 0)) || (y % 400 == 0))
return true;
else
return false;
}
int main()
{
int year = 0;
scanf("%d", &year);
if (is_leap_year(year))//函数的调用
printf("闰年\\n");
else
printf("平年\\n");
return 0;
}
编译器读取代码是从上往下依次读取的,由此亦可看出,函数的定义是特殊的声明。
再以简单加法为例:
//函数的声明
//int Add(int x, int y);
//
//int main()
//{
// int n = 0;
// int m = 0;
// scanf("%d%d", &n, &m);
// int i = Add(n, m);//函数的调用
// printf("%d\\n", i);
//
// return 0;
//}
//
////函数的定义
//int Add(int x, int y)
//{
// return x + y;
//}
二,多文件概念及使用
我们在日常的学习中,或许不会接触多文件,而真正的可视化反馈是在一些公司或团体中协作编写代码时。
C语言多文件编程是将程序按功能模块拆分到多个 .c 源文件和 .h 头文件中,核心解决单文件代码冗长、维护难、复用性低的问题,是C语言项目开发的标准写法,核心遵循头文件做声明,源文件做实现的规则。
1. 头文件(.h):仅做“接口声明”,不写实现
2. 源文件(.c):仅做“功能实现”,配合头文件
3. 主文件(.c):程序入口,代码主体
接下来我用几张截图来具象化它:

此图我们继续以简单加法为例,新建点.c及.h文件,并将函数的定义及函数的声明放进去,代码正常运行。
该用法的好处是可以分开这几部分来编写代码,也就是可以多人同时分工写代码。这在我们平时的学习当中似乎多此一举,然而,在一些团体比赛或创作,乃至于公司企业多人分工做项目中,都发挥着举足轻重的作用。
比如一个公司要写一个计算器,员工b负责写加法,员工c负责写减法,员工d负责写乘法,员工e负责写除法,而员工a则将整合所有代码并写函数主体,从而完成一个大型项目计算器(在这里假设大型项目是计算器)。

需要补充的是,如果函数的声明及定义与主函数分部化,便需要自己创建头文件,而自己创建的头文件使用引号包含。
如:#include"add.h", 解决了函数声明的问题。
当然,如果缺少了add.h文件中的声明,代码一样可以运行,在单文件中,函数的定义需要在函数主体之前充当声明,而在多文件中可以直接运行,只不过VS会警告,你的自定义函数未定义。
多文件的好处还有很多,比如一些大型游戏公司需要能够支持游戏运行的游戏引擎,会购买一些游戏引擎版权。然而,卖版权的公司,为了保证自己能够每年获利,便会隐藏自己类似自定义函数部分的处理和逻辑,只把类似add.h和函数主体明示给游戏公司,隐藏的部分会用“静态库”处理。
这样的话,类似自定义函数的处理和核心逻辑,就会以乱码的形式呈现给游戏公司,除非游戏公司反编译(盗版),否则,其将无法获取核心内容,只有使用权。

游戏公司作为甲方,只需要在自己的主体函数中导入静态库, 并将卖家的头文件和函数主体以.lib形式,拷贝到自己文件中,便只有使用权,查看.lib文件只会出现一堆乱码。
我在这里具体模拟演示一遍:
1,将卖家提供的游戏引擎拷贝到自己文件中。

2,在自己文件中导入卖家的静态库。

3,试运行后出现警告。

四,此时你的add文件中多出文件。

五,你尝试打开add.ilb文件,出现乱码。
总而言之,多文件在具体的生活中有丰富的应用,他在公司,保护自身版权及利益上发挥着巨大作用。
感谢阅读。



