40

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

4

5 回答 5

19

从 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 的回答。BeforeHashclang-format

于 2018-02-04T16:13:09.670 回答
7

您可能只想自己修补它并提出拉取请求。

这并不难,我曾经提出过同样平凡的拉取请求。clang 格式的代码非常整洁。Clang-format 已经以您想要的方式处理代码注释,将它们与周围的代码对齐(至少它具有启用此功能的选项),因此制作一个补丁来以相同的方式处理某些 PP 指令应该很简单。

或者,您可以自己编写补丁并使用额外选项从源代码自己编译 clang,以便在您的项目中使用。在我决定向他们发送补丁之前,我也这样做了。

我只花了几个小时就弄清楚了如何做到这一点,他们的代码比许多其他开源项目的代码干净得多。

于 2015-08-24T15:11:57.513 回答
4

通过手动检查各种 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 _

于 2021-02-02T06:38:24.987 回答
4

已经很晚了,但这是您正在寻找的解决方案。它将编译指示与代码块一起格式化。您可以在他们最终支持编译指示缩进之前使用它。

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
于 2017-07-18T06:25:36.887 回答
1

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

有一个Astyle Visual Studio 扩展

于 2019-11-01T07:04:26.300 回答