【发布时间】:2023-02-07 11:17:37
【问题描述】:
我正在尝试找到一种方法来禁止在我的 C++ 项目中使用某些函数、类和头文件。
更准确地说,在我的工作项目中,我们尽量避免使用 C++iostream库,因为它极大地增加了我们服务的二进制大小。相反,我们尝试使用标准输入输出图书馆。
我想添加一个自动验证,我们不使用某些头文件(iostream...)、类(std::istream、std::ostream...)和函数(std::getline...)到我们的 CI/CD 管道。
还必须有一种方法可以忽略某些目录(例如 3d 方库、测试和模拟)的这种验证,或者,如果可能的话,忽略一些单独的行。
【问题讨论】:
-
只要有一个脚本就可以在签入时解析“禁止”包含的文件,如果它在文件中找到其中一个包含,则拒绝签入(合并请求或类似的东西)。我不会让它太难(例如,每个组件都有一个禁止文件列表)
-
与其禁止包含,不如在 CI 环境中分析可执行文件/库的大小并寻找大小的突然跳跃?不仅仅是
#include可以做到这一点。 -
@PepijnKramer 和@user17732522 我认为这两个极端都是可以处理的,这取决于您愿意付出多少努力。编写一个脚本应该相当简单,
greps 用于(例如)预提交挂钩中的禁止关键字或 CI 工作。或者,您可以使用像 libclang 这样的工具来系统地检查传递包含或函数调用。无论哪种方式,请确保规则透明且简单。维护软件是一件很痛苦的事情,贡献它一点也不好玩。 -
如果您真的很投入,您甚至可以编写自己的 clang tidy 检查器来自动修复(部分)您的违规代码 sn-ps,但这绝对不是一项简单的任务……
-
@joergbrech 是的,当然,libclang 可以。这是一个更好的建议。
标签: c++ continuous-integration embedded-linux iostream