使用clang格式缩进预处理程序指令

时间:2014-06-29 12:44:31

标签: c++ code-cleanup clang-format

我正在开发一个c ++项目,我正在使用很多#pragma omp。我使用精彩的clang格式来整理,但它总是删除所有预处理器指令的缩进。有没有办法改变这种行为?或者是否有其他格式化工具更值得推荐?或者我应该避免使用这些工具吗?

5 个答案:

答案 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 个选项,如下所示:

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 version 9 开始可用)在哈希之前缩进 (#)

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();
}