AI Academy
促销
CodeGym University
学习
课程
任务
调查 & 测验
游戏
帮助
日程
社区
Users
论坛
聊天
文章
成功故事
动态
评价
订阅
浅色主题
课时
评论
关于我们
开始
开始学习
立即开始学习
我的进度
课程
任务地图
课程
C++
C++
级别 27
Include guards 和 #pragma once
C++ SELF
等级 27,
课时 0
我们来分析为什么通过
#include
重复包含头文件会导致重定义错误,预处理器在哪个阶段工作,以及如何使用
#ifndef
/
#define
/
#endif
(include guard)或指令
#pragma once
来保护头文件。在一个小项目上巩固知识并讨论常见错误:遗忘
#endif
、宏名不唯一以及保护中的“漏洞”。
“Include What You Use”: 最小化依赖
C++ SELF
等级 27,
课时 1
解析实用原则
Include What You Use
在 C++ 中的应用:如何让头文件自包含、避免传递性依赖、分离接口(
.hpp
)与实现(
.cpp
)、选择像
<iosfwd>
这样轻量的头而不是笨重的(
<iostream>
),以及为何把自己的头文件放在第一位很有用。通过
std::string
、
std::vector
的示例和小型项目模块,展示如何减少构建时间并提高对重构的鲁棒性。
Forward declaration
C++ SELF
等级 27,
课时 2
我们来解析预声明(
forward declaration
)如何在 C++ 中帮助“瘦身”头文件:在写了
struct
/
class
X
;
之后编译器到底知道什么,可以在何处使用不完整类型(指针/引用),何处不能使用(按值存储、访问字段、容器),如何构建规则“
.hpp
— 声明,
.cpp
— 重的
#include
”,以及哪些典型错误会导致关于
incomplete type
的报错。
循环依赖 — 如何处理
C++ SELF
等级 27,
课时 3
我们来解析什么是 C++ 中的循环依赖(比如
A.hpp
包含
B.hpp
,而后者又回头包含前者),为什么
#pragma once
并不会使类型变为“完整类型”,如何阅读关于
incomplete type
的错误信息,以及有哪些实用手段可以打破循环:使用
forward declaration
+
*
/
&
、把
#include
从
.hpp
移到
.cpp
,或者通过
id
来保存关联而不是直接保存对象。
模板与头文件
C++ SELF
等级 27,
课时 4
讲解在 C++ 中使用模板的实用规则:为什么
template
的定义必须在使用处可见,为什么“在
.hpp
中声明,在
.cpp
中定义”会失效,如何正确地将实现保存在
.hpp
或者通过包含的实现文件
.tpp
/
.inl
中,以及常见的错误(包括非自包含的头文件、多余的依赖和在头文件中使用
using
namespace
)。
Please enable JavaScript to continue using this application.