头文件保护
本课属于 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 已经定义,因此整个代码块会被跳过。防护宏名称通常是文件名的大写形式,并用下划线替换点号和特殊字符。
你创建的每个头文件都应该有包含保护。这是一种标准做法,可以防止编译错误,并确保你的代码可以安全地在项目中的任何位置包含。
挑战
简单添加包含保护,防止头文件被重复包含。你将在上一课的问候语工具基础上继续编写,但这次要确保头文件可以安全地多次包含。
你将创建两个文件:
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;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C 在线编译器