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

daw*_*eck 23 c++ code-cleanup clang-format

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

Gab*_*les 7

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

注意:截至撰写本文时,Clang 12 已发布。有关当前发布的任何版本的最新 Clang 格式选项文档,请参阅此处: https: //clang.llvm.org/docs/ClangFormatStyleOptions.html

因此,您可以在.clang-format文件中指定 3 个选项,如下所示:

1.无缩进

IndentPPDirectives: None
Run Code Online (Sandbox Code Playgroud)

例子:

#if FOO
#if BAR
#include <foo>
#endif
#endif
Run Code Online (Sandbox Code Playgroud)

2. 散列后缩进 ( #)

IndentPPDirectives: AfterHash
Run Code Online (Sandbox Code Playgroud)

例子:

#if FOO
#  if BAR
#    include <foo>
#  endif
#endif
Run Code Online (Sandbox Code Playgroud)

3.(我认为最新和最好的选项——从Clang-Format 版本 9开始可用)在哈希值之前缩进 ( #)

IndentPPDirectives: BeforeHash
Run Code Online (Sandbox Code Playgroud)

例子:

#if FOO
  #if BAR
    #include <foo>
  #endif
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

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

参考

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

有关的

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


Chr*_*eck 6

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

这并不难,我做了一次同样普通的拉动请求.clang格式代码非常整洁.Clang格式已经按照您想要的方式处理代码注释,将它们与周围的代码对齐(至少它有一个选项来启用它),因此制作补丁以同样的方式处理某些PP指令应该是直截了当的.

或者,您可以自己编写补丁并使用额外选项从源代码编译,以便在项目中使用.在我决定发送修补程序之前,我也做过这个.

我认真地花了几个小时来弄清楚如何做到这一点,他们的代码比许多其他开源项目的代码清晰得多.


Med*_*Yeh 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
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,只要您的代码没有任何已注释掉的#pragmas 会因此重新启用。如果您的代码确实有它们,则可以将“#pragma omp”替换为“// AWRBHAWRBWAQ”之类的内容。几乎任何注释都可以,只要它尚未出现在源代码中即可。 (2认同)

mer*_*nND 5

从6.0版开始,IndentPPDirectives可以使用该选项。在此评论中描述了用法。

IndentPPDirectives: None在以下结果中使用结果:

#if FOO
#if BAR
#include <foo>
#endif
#endif
Run Code Online (Sandbox Code Playgroud)

虽然IndentPPDirectives: AfterHash给出:

#if FOO
#  if BAR
#    include <foo>
#  endif
#endif
Run Code Online (Sandbox Code Playgroud)

  • 据我所知(尝试),这不会缩进`#pragma omp ...`以匹配周围的代码。相反,它只会根据语句嵌套在其他指令(例如您显示的“ #if”)中的级别缩进。 (2认同)