clang-format 有
IncludeIsMainRegex
来确定多个文件是否共享相同的 主标头,以便首先放置此 #include
指令。够整洁。
我几乎总是使用这种样式的前向声明标头:“entity_fwd.hpp”、“entity.hpp”和“entity.cpp”。另外还有一个“entity_test.cpp”,它应该使用“entity.hpp”标头。但是,“entity.hpp”应使用“entity_fwd.hpp”作为其主标头。
所以,我真正需要的是一种将附加标头指定为main的方法,而不是使用相同的main标头的附加源文件。
有没有人找到一种方法让 clang-format 做到这一点?
编辑: 好的,更多背景信息。假设我有这个标题,称为
entity_fwd.hpp
:
class Entity;
class Player;
class MOB;
bool collisionTest(Entity const & e1, Entity const & e2);
然后我就有了一个正常的定义标题,
entity.hpp
:
#include "entity_fwd.hpp"
#include "world.hpp"
#include <vector>
class Entity {
public:
Entity(Entity const &) = delete;
virtual bool isAlive() const;
...
};
...
最后是一个实现文件,
entity.cpp
:
#include "entity.hpp"
bool collisionTest(Entity const & e1, Entity const & e2) {
...
}
bool Entity::isAlive() const {
...
}
...
对于
entity.cpp
clang-format 知道 entity.hpp
是该文件的 主标头,基于标头文件名的主干;术语 main header 是 clang-format 的术语。 主标题将被放置在包含列表的第一位。
对于
entity.hpp
,主标题 应为 entity_fwd.hpp
。我可以使用 IncludeCategories
和正则表达式 '_fwd.h(pp)?"$'
来首先对 entity_fwd.hpp
进行排序,但这会将 all _fwd
标题放在第一位,其中只有 entity_fwd.hpp
应该得到特殊处理。
clang-format
的最新
文档显示了一个新的样式选项
IncludeIsMainSourceRegex
,这似乎正是您所需要的。这不在版本 10.0.0 中,因此您需要找到比该版本更新的 clang-format
版本。
可悲的是,我相信答案是“不,这是不可能的,而且不会很快”。据我所知,clang 格式的设计者在设计这些选项时做出了一个核心假设,不幸的是,它明确排除了
_fwd.hh
模式。
@eric-backus 的答案给出了一半的解决方案。它表明 clang-format 有一个新选项
IncludeIsMainSourceRegex
,它可以让您扩展哪些文件有资格拥有“主”包含文件的概念。这是一个好的开始!
问题是解决方案的后半部分是不可能的。
IncludeIsMainRegex
允许您“指定文件到主包含映射中允许的后缀的正则表达式”。请注意,这些是文件本身的后缀。我们需要指定的是包含文件的后缀。唯一可能发生的方法是 clang-format 添加具有新语义的全新选项。
(顺便说一句:如果这没有帮助,他们为什么还要添加新选项?我的理解是,它可以让您处理“foo.hh”应该是“foo_impl.hh”的第一个包含的情况”。)