c++ - 如何检查每个头文件是否包含所需的包含文件?
问题描述
我正在使用 C++ 和 cmake 开发我的应用程序。
我想检查每个 C++ 头文件是否正确包含所需的包含文件。
这是一个例子:
一个.hpp
inline void func_a() {
}
b.hpp
// #include "a.hpp" is missing
inline void func_b() {
func_a();
}
主文件
#include "a.hpp"
#include "b.hpp"
int main() {}
演示:https ://wandbox.org/permlink/kZqoNHMYARIB3bc1
b.hpp 应包括 a.hpp。假设 b.hpp 缺少包含 a.hpp。如果 main.cpp 在 b.hpp 之前包含 a.hpp,则不会发生编译错误。如果包含顺序相反,则会发生编译错误。
我想检查一下这种问题。
我在 emacs 上使用 fly-check。它很好地检查了这个问题。我想在我的 cmake 构建系统中加入一些检查机制。
例如,如果我执行make depcheck
,则检测到编译错误。
我认为如果我设置一个单独编译所有头文件但不链接的 cmake 目标,则会报告预期的编译错误。
到目前为止,我找不到如何设置它。
有没有办法做到这一点?或者其他方式来实现目标?
我的头文件包含政策
每个头文件都应包含包含所需元素的头文件。换句话说,每个头文件都应该单独编译。
我想要达到的目标
我想知道通过工具辅助自动检测 b.hpp is missing `#include "a.hpp" 的方法。该工具意味着不是编辑器。我想cmake可以做到这一点。我正在努力寻找方法。
解决方案
传统的智慧是将源文件添加到每个标题中。即使b.cpp
只包括这一行:
include "b.hpp" // Note, this should be the first include
这样,您可以单独编译每个 cpp 文件,并且编译成功意味着相应的头文件是自包含的。
当然,如果您已经有一个实现文件,那么首先移动要包含的相应标头有助于确保这一点。
推荐阅读
- excel - 在概率列表中生成随机数,如果该行标记为“false”,则滚动失败
- php - 无法使用 PDO 从 PHP 将表情符号/表情符号保存在 MySQL 中,但可以从 cmd/phpmyadmin 插入它们
- c# - 对类型“IAuthorizeData”的引用声称它在“Microsoft.AspNetCore.Authorization”中定义,但找不到
- python - 如何找到小时数的日期?
- r - R - 从其他行中提取值
- sas - 如何将 SAS 代码转换为 SAS 宏?
- c# - 从客户端自动设置属性
- prometheus - Prometheus 2.x 限制内存使用
- javascript - 在我的 webpack npm 主项目的子项目中使用 config 和 node_modules
- google-sheets - 如何在允许多次迭代的同时使用 ISBLANK