如何防止内含破损
How do I prevent include breakage
本文关键字:何防止 更新时间:2023-10-16
我有一个包含大量 cpp/头文件的代码。我现在的问题是,因为许多指令相互包含,我偶尔会遇到我的代码无法编译的情况,除非我在随机文件中重新排序#include
指令,现在这基本上是创建任何其他头文件所必需的。
这真的非常烦人;有什么提示我应该如何编写我的c ++代码以防止#include
复杂化吗?我更愿意将我的源代码拆分为尽可能多的文件,以便与其他程序员(使用 git 或 svn)的合作更容易(更多文件 == 更少的编辑冲突)。
现在对我有帮助的一件事是前向声明,当我将其他标头中的类声明到其他文件中时。这有时会有所帮助,但并不能解决所有问题;有时我只需要更改随机头文件中#include
的顺序或合并多个文件。
不是灵丹妙药,但以下指南对我有很大帮助。
假设您的代码由具有相应MyClassXyz.h
的MyClassXyz.cpp
等文件组成,每个源文件一个类,每个 cpp 文件都应首先包含其相应的头文件。也就是说,MyClassXyz.cpp
必须以以下行开头:
// (possibly after comments)
#include "MyClassXyz.h"
这可确保MyClassXyz.h
包含编译所需的所有头文件(或前向声明)。
我经常看到使用相反约定的代码(首先#include
大多数通用头文件),例如,MyClassXyz.cpp
开头
#include <vector>
#include <iosfwd>
#include "blah.h"
#include "mytypes.h"
#include "MyClassXyz.h"
MyClassXyz.h
使用附加标头中定义的内容"直奔主题":
#pragma once
// "#include <vector>" missing - a hidden error!
// "#include <iosfwd>" missing - a hidden error!
class MyClassXyz
{
std::vector<int> v;
friend std::ostream& operator<<(...);
...
}
虽然这编译正常,但在尝试在其他源文件中使用类MyClassXyz
时,它会给您描述的类型带来巨大的麻烦。
相关文章:
- 防止主数据类型C++的隐式转换
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何防止C++遗留代码中的挂起指针
- Python中的for循环与C++有何不同
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何防止初始值设定项列表中的错误值?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- C++ 防止在映射中放置()时调用析构函数
- 是否可以防止省略聚合初始化成员?
- 在C++中释放内存期间,迭代器与指针有何不同
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 防止在C++中选择错误文件时提升 xml 解析器崩溃
- std::mutex 如何防止线程修改?
- 防止C++中的硬编码数字
- 防止在复制构造函数中隐式调用基构造函数
- 如何防止 CUDA-GDB 中的<优化输出>值
- 防止组合框被关闭
- 按下特定键时快速按此键.如何防止按下扳机键?(C++)