Menu
CoddyTech

静态函数

本课属于 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 在文件级别实现封装的方式。静态函数可以隐藏实现细节,让公共接口保持简洁,同时在内部使用你需要的辅助逻辑。

challenge icon

挑战

简单

我们来构建一个距离计算器,它使用私有辅助函数计算一个数的平方:这是一个应当对程序其余部分隐藏的实现细节。

你将创建 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;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C 在线编译器