我正在开发一个 c++ 项目,我在其中使用了很多#pragma omp
. 我使用美妙的 clang 格式来保持整洁,但它总是删除所有预处理器指令的缩进。有没有办法改变这种行为?还是有其他更值得推荐的格式化工具?还是我应该完全避免使用这些工具?
5 回答
从 6.0 版开始,IndentPPDirectives
可以使用该选项。这篇评论中描述了用法。
使用IndentPPDirectives: None
结果:
#if FOO
#if BAR
#include <foo>
#endif
#endif
虽然IndentPPDirectives: AfterHash
给出:
#if FOO
# if BAR
# include <foo>
# endif
#endif
编辑:有关第9 版中引入的选项的详细信息,请参阅@Gabriel Staples 的回答。BeforeHash
clang-format
您可能只想自己修补它并提出拉取请求。
这并不难,我曾经提出过同样平凡的拉取请求。clang 格式的代码非常整洁。Clang-format 已经以您想要的方式处理代码注释,将它们与周围的代码对齐(至少它具有启用此功能的选项),因此制作一个补丁来以相同的方式处理某些 PP 指令应该很简单。
或者,您可以自己编写补丁并使用额外选项从源代码自己编译 clang,以便在您的项目中使用。在我决定向他们发送补丁之前,我也这样做了。
我只花了几个小时就弄清楚了如何做到这一点,他们的代码比许多其他开源项目的代码干净得多。
通过手动检查各种 Clang-Format Style Options 页面,我确定从 Clang-format 版本 9开始,出现了第 3 个(在我看来也是最好的)选项,称为BeforeHash
.
注意:截至撰写本文时,Clang 12 已发布。有关当前发布的任何版本的最新 Clang 格式选项文档,请参见此处:https ://clang.llvm.org/docs/ClangFormatStyleOptions.html 。
因此,在您的.clang-format
文件中,您可以指定 3 个选项,如下所示:
1. 无缩进
IndentPPDirectives: None
例子:
#if FOO
#if BAR
#include <foo>
#endif
#endif
2. 哈希后缩进 ( #
)
IndentPPDirectives: AfterHash
例子:
#if FOO
# if BAR
# include <foo>
# endif
#endif
3.(我认为最新和最好的选项——从Clang-Format 版本 9开始提供)在哈希 ( #
)之前缩进
IndentPPDirectives: BeforeHash
例子:
#if FOO
#if BAR
#include <foo>
#endif
#endif
参考
对于所有这些文档,以及我上面使用的确切示例的来源,请参阅此处的 LLVM Clang 格式样式选项官方文档的IndentPPDirectives部分:https://clang.llvm.org/docs/ClangFormatStyleOptions。 .html _
已经很晚了,但这是您正在寻找的解决方案。它将编译指示与代码块一起格式化。您可以在他们最终支持编译指示缩进之前使用它。
https://github.com/MedicineYeh/p-clang-format
主要概念是替换字符串,以便格式化程序在这些 pragma 上使用“正确”规则。动机示例如下。
# 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
astyle
(艺术风格)#pragma omp
很好地缩进代码,开箱即用。似乎甚至没有改变行为的选项。只有续行不缩进,如示例中所示 - 我希望行续行缩进,可能是 8 个空格,在omp
. 其他 pragma 左对齐。
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();
}