0Pricing
C Academy · 课时

头文件与源文件

分离声明和代码。

头文件与源文件 是 CoddyKit 上的免费 C Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。

为什么要将代码拆分到多个文件中

随着 C 程序不断增大,将所有内容放在一个 .c 文件中会越来越难以阅读,编译速度也会变慢。

C 允许您将项目拆分到多个文件中:每个文件负责一个方面。这样可以改善组织结构、复用代码,并且修改某一部分时不必重新编译全部内容。

两种文件类型

模块化的 C 项目使用两种文件类型。

源文件(.c)包含实际实现:函数体和定义。

头文件(.h)包含声明:函数原型、类型定义,以及其他文件需要了解的宏。

头文件

头文件声明存在什么内容,而不说明它如何工作。

这里,math_utils.h 声明了一个 add 函数。任何包含此头文件的文件都会获知该函数的签名,并可以调用它。

/* math_utils.h */
int add(int a, int b);

对应的源文件

源文件提供具体实现。它包含自己的头文件,以便编译器检查定义是否与声明匹配。

请注意,这里使用引号包含头文件,这是用于您自己项目文件的写法。

/* math_utils.c */
#include "math_utils.h"

int add(int a, int b) {
    return a + b;
}

使用模块

现在,main.c 包含了头文件并调用 add。它看不到函数体,只能看到函数原型。

编译器信任该声明;之后,链接器会将这次调用连接到 math_utils.c 中的实际实现。

/* main.c */
#include <stdio.h>
#include "math_utils.h"

int main(void) {
    printf("%d\n", add(2, 3));
    return 0;
}

引号与尖括号

#include 指令有两种形式。

#include <stdio.h> 使用尖括号表示系统头文件和标准库头文件。编译器会在标准包含路径中搜索。

#include "math_utils.h" 使用引号表示您自己的头文件,并优先在当前目录中搜索。

#include <stdio.h>      /* standard library */
#include "math_utils.h" /* your project */

头文件中应放置什么

请将声明放在头文件中,而不是定义。

适合放入头文件的内容包括:函数原型、struct 和 typedef 声明、#define 宏,以及 extern 变量声明。

请避免在那里放置函数体或变量定义,否则可能导致重复符号错误。

/* shapes.h */
typedef struct {
    double width;
    double height;
} Rect;

double rect_area(Rect r);

源文件中应放置什么

源文件包含真正执行工作的内容:函数定义和该文件的私有辅助函数。

它包含对应的头文件,以便编译器验证签名是否一致。这可以尽早发现不匹配,而不是等到链接时才发现。

/* shapes.c */
#include "shapes.h"

double rect_area(Rect r) {
    return r.width * r.height;
}

声明与定义

这一差别是模块化 C 的核心。

声明告诉编译器某个名称的类型和签名,使其可以被使用:int add(int, int);

定义会创建实际的实体,分配存储空间或提供函数体。头文件负责声明;源文件负责定义。

int add(int a, int b);          /* declaration */
int add(int a, int b) {         /* definition */
    return a + b;
}

命名约定

一种常见模式是让每个模块使用成对的名称:logger.h 与 logger.c,parser.h 与 parser.c。

这样可以一眼看出实现所在的位置。请将相关函数归入同一个模块,使每个文件都承担单一且明确的职责。

/* logger.h */
void log_info(const char *msg);
void log_error(const char *msg);

构建过程概览

每个 .c 文件都会独立编译为目标文件,然后所有目标文件会被链接成一个程序。

头文件不会单独编译;它们会以文本形式插入到包含它们的源文件中。我们将在后续课程中详细学习完整的构建流程。

gcc -c main.c        /* -> main.o */
gcc -c math_utils.c  /* -> math_utils.o */
gcc main.o math_utils.o -o app

快速检查

检验您对头文件和源文件作用的理解。

回顾

您已经学会将 C 项目拆分为 .h 头文件和 .c 源文件。

头文件声明存在什么内容;源文件定义它如何工作。您自己的头文件使用引号,标准头文件使用尖括号。

接下来,我们将防止因重复包含头文件而产生的问题。

常见问题解答

「头文件与源文件」课时是免费的吗?

是的 — 「头文件与源文件」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。

「头文件与源文件」这节课中我会学到什么?

分离声明和代码。 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「头文件与源文件」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C Academy 课中编写并运行代码吗?

能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 头文件与源文件
  2. 包含保护
  3. extern 与链接
  4. 编译多个文件
← 返回 C Academy