我正在开发一个c ++项目,我正在使用很多#pragma omp
。我使用精彩的clang格式来整理,但它总是删除所有预处理器指令的缩进。有没有办法改变这种行为?或者是否有其他格式化工具更值得推荐?或者我应该避免使用这些工具吗?
答案 0 :(得分:5)
您可能只想自己修补并提出拉取请求。
这并不难,我做了一次同样普通的拉动请求。 clang格式代码非常整洁。 Clang格式已经按照你想要的方式处理代码注释,将它们与周围的代码对齐(至少它有一个启用它的选项),所以制作补丁以同样的方式处理某些PP指令应该是直截了当的。
或者,您可以自己编写补丁并使用额外选项从源代码编译,以便在项目中使用。在我决定向他们发送补丁之前,我也做过这个。
我认真地花了几个小时来弄清楚如何做到这一点,他们的代码很多比许多其他开源项目的代码更清洁。
答案 1 :(得分:4)
从6.0版开始,可以使用选项IndentPPDirectives
。用法在this review中描述。
使用IndentPPDirectives: None
会导致:
#if FOO
#if BAR
#include <foo>
#endif
#endif
虽然IndentPPDirectives: AfterHash
给出了:
#if FOO
# if BAR
# include <foo>
# endif
#endif
答案 2 :(得分:3)
通过手动检查各种 Clang-Format 样式选项页面,我确定出现了 as of Clang-format version 9,这是第三个(在我看来也是最好的)选项,称为 BeforeHash
。
注意:截至撰写本文时,Clang 12 已发布。有关当前发布的任何版本的最新 Clang 格式选项文档,请参阅此处:https://clang.llvm.org/docs/ClangFormatStyleOptions.html。< /p>
在您的 .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
对于所有这些文档以及我在上面使用的确切示例的来源,请参阅此处的 LLVM Clang-format Style Options 官方文档的 IndentPPDirectives 部分:{{3} }.
答案 3 :(得分:2)
已经很晚了,但这是您正在寻找的解决方案。 它将pragma与代码块一起格式化。 您可以在最终支持pragma缩进之前使用它。
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
答案 4 :(得分:0)
astyle
(艺术风格)缩进#pragma omp
,开箱即用。似乎甚至没有改变行为的选择。如示例所示,仅行连续不缩进-我更愿意在omp
下缩进行连续,也许8个空格。其他编译指示向左对齐。
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();
}