静态函数
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 4 课,共 61 课。
将代码拆分到多个文件中时,源文件中定义的每个函数默认都可以被其他文件访问。但有时你需要一些仅供内部使用的辅助函数,其他文件不应访问它们,甚至不应知道它们的存在。
static 关键字用于函数时,会将函数的可见范围限制在定义它的文件内。这样就创建了一个私有函数,其他源文件无法调用它,即使有人尝试声明它也不行。
// math_utils.c
#include "math_utils.h"
// 私有辅助函数,仅在此文件中可见
static int square(int x) {
return x * x;
}
// 公共函数,可从 main.c 调用
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
在这个示例中,sum_of_squares 在头文件中声明,因此可以在任何地方使用。不过,square 被标记为 static,所以它只存在于 math_utils.c 中。如果 main.c 尝试直接调用 square(),链接器就会报错:这个函数在它所在的文件之外并不存在。
这是 C 在文件级别实现封装的方式。静态函数可以隐藏实现细节,让公共接口保持简洁,同时在内部使用你需要的辅助逻辑。
挑战
简单我们来构建一个距离计算器,它使用私有辅助函数计算一个数的平方:这是一个应当对程序其余部分隐藏的实现细节。
你将创建 3 个文件:
distance.h:头文件,用于声明一个公共函数distance_squared。它接收 4 个整数(x1、y1、x2、y2),表示两个点,并返回一个整数。使用符号DISTANCE_H添加头文件保护。distance.c:源文件,包含函数的实现。创建一个名为square的static辅助函数,它接收一个整数并返回它的平方。这个辅助函数只能在distance.c中可见。然后使用这个静态辅助函数实现distance_squared,计算 (x2-x1)² + (y2-y1)²。main.c:主文件,包含头文件并使用公共函数。这里不能访问square辅助函数,只能使用distance_squared。
distance_squared 函数用于计算两个点之间的欧几里得距离的平方。将 square 函数设为静态函数后,distance.c 以外的代码就无法访问这个实现细节。
你将收到 4 个整数输入:x1、y1、x2 和 y2。
请按以下格式输出距离的平方:
Squared distance: {result}例如,点 (0, 0) 和 (3, 4) 的输出如下:
Squared distance: 25亲手试试
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO:用输入的坐标调用 distance_squared
// 并按以下格式打印结果:“Squared distance: {result}”
return 0;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器