使用 clang-format 缩进预处理器指令

问题描述 投票:0回答:5

我正在开发一个 C++ 项目,其中使用了很多

#pragma omp
。我使用美妙的 clang-format 来保持整洁,但它总是删除所有预处理器指令的缩进。有没有办法改变这种行为?或者还有其他更值得推荐的格式化工具吗?或者我应该完全避免使用这些工具?

c++ code-cleanup clang-format
5个回答
25
投票

从版本 6.0 开始,可以使用选项

IndentPPDirectives
此评论中描述了用法。

使用

IndentPPDirectives: None
结果:

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

虽然

IndentPPDirectives: AfterHash
给出:

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

编辑:请参阅 @Gabriel Staples 的 answer,了解有关

BeforeHash
版本 9 中引入的
clang-format
选项的详细信息。


8
投票

通过手动检查各种 Clang-Format 样式选项页面,我确定 从 Clang-format 版本 9 开始,出现了第三个(在我看来最好的)选项,称为

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

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

...这样您就可以访问上面的版本 9 或更高版本的功能:

请参阅我的详细说明。目前最新版本是14.0.0

参考文献

  1. 对于所有这些文档,以及我上面使用的确切示例的来源,请参阅此处 LLVM Clang 格式样式选项官方文档的 IndentPPDirectives 部分:https://clang.llvm.org/文档/ClangFormatStyleOptions.html.

另请参阅

  1. 我的答案:如何安装最新版本的
    clang-format
    git-clang-format
    (可作为
    git clang-format
    运行)
  2. 我的基于
    clang-format
    的项目:eRCaGuy_CodeFormatter

7
投票

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

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

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

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


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

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
    

1
投票

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 扩展

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.