Menu
CoddyTech

头文件保护

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 2 课,共 61 课。

在项目中多次包含同一个头文件时,编译器会反复看到相同的声明,从而导致错误。这种情况通常发生在多个文件包含同一个头文件,或头文件互相包含时。包含保护可以解决这个问题。

包含保护使用三个预处理指令,确保头文件的内容只被处理一次:

// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H

int add(int a, int b);

#endif

它的工作原理是:#ifndef MATH_UTILS_H会检查符号 MATH_UTILS_H是否尚未定义。如果尚未定义,预处理器就会继续执行,并立即用 #define MATH_UTILS_H定义它。从这里到 #endif之间的所有内容都会包含在编译中。

第二次包含这个头文件时,MATH_UTILS_H 已经定义,因此整个代码块会被跳过。防护宏名称通常是文件名的大写形式,并用下划线替换点号和特殊字符。

你创建的每个头文件都应该有包含保护。这是一种标准做法,可以防止编译错误,并确保你的代码可以安全地在项目中的任何位置包含。

challenge icon

挑战

简单

添加包含保护,防止头文件被重复包含。你将在上一课的问候语工具基础上继续编写,但这次要确保头文件可以安全地多次包含。

你将创建两个文件:

  • greet.h:你的头文件,其中包含 greet 函数声明。这次要使用符号 GREET_H 添加包含保护,将整个文件内容包起来。
  • main.c:你的主文件,用于包含头文件、实现 greet 函数,并在 main() 中调用它。

greet 函数应接受一个 const char* 参数作为姓名,并打印:

Hello, Alice!

你的头文件应采用以下结构:

#ifndef GREET_H
#define GREET_H

// function declaration here

#endif

你会收到一个输入:一个姓名(字符串)。

请严格按照上面的格式打印问候语,将 Alice 替换为提供的姓名。

亲手试试

#include <stdio.h>
#include "greet.h"

// TODO:实现 greet 函数,打印 "Hello, <name>!"

int main() {
    char name[100];
    scanf("%s", name);
    
    // TODO:将 name 传给 greet 函数并调用它
    
    return 0;
}
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: C 在线编译器