我正在开发一个 C++ 项目,其中使用了很多
#pragma omp
。我使用美妙的 clang-format 来保持整洁,但它总是删除所有预处理器指令的缩进。有没有办法改变这种行为?或者还有其他更值得推荐的格式化工具吗?或者我应该完全避免使用这些工具?
通过手动检查各种 Clang-Format 样式选项页面,我确定 从 Clang-format 版本 9 开始,出现了第三个(在我看来最好的)选项,称为
BeforeHash
。
注意:截至撰写本文时,Clang 12 已发布。 有关当前发布的任何版本的最新 Clang 格式选项文档,请参阅此处:https://clang.llvm.org/docs/ClangFormatStyleOptions .html.
在您的
.clang-format
文件中,您可以指定 3 个选项,如下所示:
IndentPPDirectives: None
示例:
#if FOO
#if BAR
#include <foo>
#endif
#endif
#
)IndentPPDirectives: AfterHash
示例:
#if FOO
# if BAR
# include <foo>
# endif
#endif
#
)IndentPPDirectives: BeforeHash
示例:
#if FOO
#if BAR
#include <foo>
#endif
#endif
clang-format
...这样您就可以访问上面的版本 9 或更高版本的功能:
请参阅我的详细说明。目前最新版本是14.0.0。
clang-format
和git-clang-format
(可作为git clang-format
运行)clang-format
的项目:eRCaGuy_CodeFormatter您可能只想自己修补它并发出拉取请求。
这并不难,我曾经提出过一个类似的普通拉取请求。 clang 格式的代码非常整洁。 Clang-format 已经按照您想要的方式处理代码注释,将它们与周围的代码对齐(至少它有一个选项来启用此功能),因此制作补丁以相同的方式处理某些 PP 指令应该很简单。
或者,您可以自己编写补丁并使用额外选项从源代码编译 clang,以在您的项目中使用。在决定向他们发送补丁之前我也这样做了。
我只花了几个小时就弄清楚了如何做到这一点,他们的代码比许多其他开源项目的代码干净得多。
https://github.com/MedicineYeh/p-clang-format
主要概念是替换字符串,以便格式化程序在这些编译指示上使用“正确”的规则。动机示例如下。
# Replace "#pragma omp" by "//#pragma omp"
sed -i 's/#pragma omp/\/\/#pragma omp/g' ./main.c
# Do format
clang-format ./main.c
# Replace "// *#pragma omp" by "#pragma omp"
sed -i 's/\/\/ *#pragma omp/#pragma omp/g' ./main.c
#pragma omp
,开箱即用。似乎甚至没有改变这种行为的选择。只有续行不缩进,如示例中所示,我希望续行缩进,也许 8 个空格,位于
omp
下。其他编译指示左对齐。
void foo()
{
#pragma omp parallel
#pragma omp master
{
#pragma omp task depend( some_expression ) \
depend( other_expression ) \
priority(1)
{
code();
}
}
#pragma other
code();
}
成为
void foo()
{
#pragma omp parallel
#pragma omp master
{
#pragma omp task depend( some_expression ) \
depend( other_expression ) \
priority(1)
{
code();
}
}
#pragma other
code();
}
有一个 Astyle Visual Studio 扩展。