- 函数的嵌套调用和链式访问
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的
1.1 嵌套调用
代码演示:
define _CRT_SECURE_NO_WARNINGS
include<stdio.h>
void new_line()
{
printf("hehe\n");
}
void three_line()
{
int i = 0;
for (i = 0; i < 3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
注意:函数可以嵌套调用,但是不能嵌套定义,每个函数地位都是相等的,并列的关系
1.2 链式访问
把一个函数的返回值作为另外一个函数的参数
链式访问的条件:函数必须有返回值
代码演示:
define _CRT_SECURE_NO_WARNINGS
include<stdio.h>
include<string.h>
int main()
{
int len = strlen("abcdef");
printf("%d\n", len);
//链式访问
printf("%d\n", strlen("abcdef"));
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
运行结果:
分析:printf函数的返回值是打印的字符的个数
- 函数的声明和定义
2.1函数声明:
写一个加法函数:
define _CRT_SECURE_NO_WARNINGS
include<stdio.h>
int Add(int x, int y);//函数的声明
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//加法
int sum = Add(a, b);
printf("%d\n", sum);
return 0;
}
//函数的定义
int Add(int x, int y)
{
return x + y;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
如果不进行函数声明,程序可以编译运行,但是会出现警告
注意:1. 函数声明是告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了
- 函数的声明一般出现在函数的使用之前。要满足先声明后使用
- 函数的声明一般要放在头文件中的
2.2函数定义:
函数的定义是指函数的具体实现,交待函数的功能实现
举个栗子:
实现一个计算器
1,加法——A程序猿
add.h add.c
2,减法——B程序猿
sub.h sub.c
3,乘法——C程序猿
mul.h mul.c
4,除法——D程序猿
div.h div.c
代码演示:
add.h
pragma once
//防止头文件被重复包含
int Add(int x, int y);//函数的声明
1
2
3
add.c
define _CRT_SECURE_NO_WARNINGS
int Add(int x, int y)
{
return x + y;
}
1
2
3
4
5
sub.h
pragma once
int Sub(int x, int y);
1
2
sub.c
define _CRT_SECURE_NO_WARNINGS
int Sub(int x, int y)
{
return x - y;
}
1
2
3
4
5
test.c
define _CRT_SECURE_NO_WARNINGS
include<stdio.h>
include"add.h"
include"sub.h"
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);//20 30
//加法
int sum = Add(a, b);
printf("%d\n", sum);//50
//减法
int ret = Sub(a, b);
printf("%d\n", ret);//-10
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
包含头文件的本质是将头文件的内容全部拷贝过来
在初学编程时,我们习惯把所有的代码都写到一个文件中,但是在公司中要考虑分工协作问题,模块化设计
再举个栗子:
公司B想完成一个加法功能test.c,但是他不会,程序猿A写了一个程序可以完成这个任务并且卖给B公司,后期代码的维护维修也是A来完成。为了防止公司复刻源代码,程序猿A将 add.c 编译成静态库文件add.lib,然后将头文件add.h提供给B公司,B公司就知道怎样使用,功能的实现是在add.lib中实现的,add.lib文件都是一些乱码了,无法看懂,这样就在一定程度上保护了源文件
我们看一下怎样将add.c文件编译成静态库:
add>右击鼠标>属性
配置属性>常规>配置类型>静态库(.lib)
add.c配置完成后会生成add.lib,它是无法直接执行的,所以会报错
将add.h和add.lib交给B公司
代码演示:
define _CRT_SECURE_NO_WARNINGS
include<stdio.h>
include"add.h"
pragma comment(lib,"add.lib")
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);//20 30
//加法
int sum = Add(a, b);
printf("%d\n", sum);//50
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
注意:B公司买add.lib回来之后要导入静态库文件才能使用
pragma comment(lib,"add.lib")
1
add.lib在vs中打开是这个样子的:
此时,add.c所实现的功能都在add.lib中,B公司是看不到add.c的真是实现的
如果我们将函数的声明和定义放在一起,就不能单独剥离出来让别人使用了