使用 clang-format 包含前向标头的顺序

问题描述 投票:0回答:2

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
应该得到特殊处理。

c++ clang-format
2个回答
1
投票

clang-format的最新

文档
显示了一个新的样式选项
IncludeIsMainSourceRegex
,这似乎正是您所需要的。这不在版本 10.0.0 中,因此您需要找到比该版本更新的
clang-format
版本。


0
投票

可悲的是,我相信答案是“不,这是不可能的,而且不会很快”。据我所知,clang 格式的设计者在设计这些选项时做出了一个核心假设,不幸的是,它明确排除了

_fwd.hh
模式。

@eric-backus 的答案给出了一半的解决方案。它表明 clang-format 有一个新选项

IncludeIsMainSourceRegex
,它可以让您扩展哪些文件有资格拥有“主”包含文件的概念。这是一个好的开始!

问题是解决方案的后半部分是不可能的。

IncludeIsMainRegex
允许您“指定文件到主包含映射中允许的后缀的正则表达式”。请注意,这些是文件本身的后缀。我们需要指定的是包含文件的后缀。唯一可能发生的方法是 clang-format 添加具有新语义的全新选项。 (顺便说一句:如果这没有帮助,他们为什么还要添加新选项?我的理解是,它可以让您处理“foo.hh”应该是“foo_impl.hh”的第一个包含的情况”。)

© www.soinside.com 2019 - 2024. All rights reserved.