源文件
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 3 课,共 61 课。
到目前为止,我们一直把函数声明放在头文件中,但实际的函数代码(定义)都放在主文件里。模块化编程的下一步是把这些定义移到各自的源文件(.c 文件)中。
这样就形成了清晰的三部分结构:头文件声明函数,单独的源文件定义函数,而 main 只负责使用它们。具体如下:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
// math_utils.c
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
// main.c
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(5, 3));
return 0;
}
注意,math_utils.c 包含了自己的头文件。这样可以确保函数定义与声明一致,如果两者不一致,编译器就会捕获错误。主文件只需包含头文件即可使用该函数,无需了解 add 的内部工作原理。
这种分离可以隐藏实现细节,让你修改函数逻辑时,无需改动使用这些函数的文件。
挑战
简单让我们通过将代码整理成规范的三文件结构,来构建一个简单的数学工具:一个用于声明的头文件、一个用于实现的源文件,以及一个使用它们的主文件。
你将创建三个文件:
math_ops.h:包含两个操作函数声明的头文件:multiply和subtract。这两个函数都接收两个整数,并返回一个整数。别忘了使用符号MATH_OPS_H添加包含保护。math_ops.c:包含multiply和subtract实际实现的源文件。此文件应包含它自己的头文件,以确保声明与定义一致。main.c:包含头文件并使用这两个函数进行计算的主文件。
multiply 函数应返回两个整数的乘积,subtract 函数应返回第一个整数减去第二个整数的结果。
你将收到两个整数输入:a 和 b。
在主函数中,将两个操作的结果分别打印在单独的行上:
Product: {result of multiply}
Difference: {result of subtract}例如,输入 8 和 3 时,输出为:
Product: 24
Difference: 5亲手试试
#include <stdio.h>
#include "math_ops.h"
int main() {
int a, b;
scanf("%d", &a);
scanf("%d", &b);
// TODO: 用 a 和 b 调用 multiply 函数,并保存结果
// TODO: 用 a 和 b 调用 subtract 函数,并保存结果
// TODO: 按以下格式打印结果:
// Product: {multiply 的结果}
// Difference: {subtract 的结果}
return 0;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器