c++ 使用clang格式缩进预处理器指令

s5a0g9ez  于 2023-03-25  发布在  其他
关注(0)|答案(5)|浏览(260)

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

y0u0uwnf

y0u0uwnf1#

从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

编辑:有关clang-format版本9中引入的BeforeHash选项的详细信息,请参阅@Gabriel斯台普斯的answer

mklgxw1f

mklgxw1f2#

你可能只想自己打补丁,然后提出一个pull request。
这并不难,我曾经做过一个类似的普通pull请求。clang-format代码非常整洁。Clang-format已经按照你想要的方式处理代码注解,将它们与周围的代码对齐(至少它有一个选项来启用这一点),所以制作一个补丁来以相同的方式处理某些PP指令应该很简单。
或者,你可以自己编写补丁,然后使用额外的选项从源代码编译clang,以便在你的项目中使用。在我决定把补丁发给他们之前,我也是这么做的。
我只花了几个小时就想出了如何做到这一点,他们的代码比许多其他开源项目的代码干净得多。

icnyk63a

icnyk63a3#

通过手动检查各种Clang-Format样式选项页面,我已经确定了as of Clang-format version 9,第三个(在我看来也是最好的)选项,称为BeforeHash

1.不缩进

IndentPPDirectives: None

示例:

#if FOO
#if BAR
#include <foo>
#endif
#endif

2. hash后缩进(#

IndentPPDirectives: AfterHash

示例:

#if FOO
#  if BAR
#    include <foo>
#  endif
#endif

3.(我认为最新最好的选择--从Clang-Format version 9开始可用)在hash之前缩进(#

IndentPPDirectives: BeforeHash

示例:

#if FOO
  #if BAR
    #include <foo>
  #endif
#endif

如何在Ubuntu上安装 * 最新 * 版本的clang-format

...以便您可以访问上面的版本9或更高版本的功能:
参见my detailed instructions here,目前最新版本为14.0.0

参考文献

1.对于所有这些文档,以及我上面使用的确切示例的来源,请参阅LLVM Clang-format Style Options官方文档的IndentPPDirectives部分:https://clang.llvm.org/docs/ClangFormatStyleOptions.html .

相关

1.另请参阅我的基于clang-format的项目:eRCaGuy_CodeFormatter

9vw9lbht

9vw9lbht4#

虽然已经晚了,但这是你正在寻找的解决方案。它将编译指示与代码块沿着格式化。你可以在他们最终支持编译指示缩进之前使用它。
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
bcs8qyzn

bcs8qyzn5#

astyle(艺术风格)使用代码很好地缩进了#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 extension

相关问题