可以clang格式将大括号添加到单行if语句等

Posted

技术标签:

【中文标题】可以clang格式将大括号添加到单行if语句等【英文标题】:Can clang format add braces to single line if statements etc 【发布时间】:2014-11-24 12:15:34 【问题描述】:

clang-format 是否可以选择为所有 if()/do/while 语句等添加大括号?

例如

if( i == 42 )
   std::cout << "You found the meaning of life\n";
else
   std::cout << "Wrong!\n";

if( i == 42 )

   std::cout << "You found the meaning of life\n";

else

   std::cout << "Wrong!\n";

使用

$ clang-format --version
clang-format version 3.6.0

【问题讨论】:

我在Clang-Format Style Options.的快速扫描中没有找到任何选项 @BaummitAugen 我也做不到 - 但对某些选项的作用的描述非常模糊,恕我直言 请参阅this answer,了解如何搜索常见的不带括号的单行。 你无法弥补。他们格式化一切......除了这个 【参考方案1】:

clang-tidy 可以使用 FIXITS 对您的代码进行语法更改

clang-tidy YOUR_FILE.cpp -fix -checks="readability-braces-around-statements" -- COMPILE_OPTIONS

更新:

clang-tidy 是一个重量级的工具,因为它需要编译选项来解析文件,遗憾的是 clang-format(从 v3.9 开始)不会添加大括号。

COMPILE_OPTIONS 将是您用于编译文件的包含路径等,即-std=c++14 -stdlib=libc++ -O2 -I.

如果你有一个来自 CMake 的 compile_options.json 文件,那么你可以将它包含的目录的路径传递给 clang-tidy,它会为该文件查找适当的编译选项:

clang-tidy YOUR_FILE.cpp -fix -checks="readability-braces-around-statements" -p COMPILE_OPTIONS_DIR

【讨论】:

是否可以在不制作编译数据库的情况下运行它?假设我纯粹只是想运行可读性检查,而不是寻找编译错误。我问是因为我想编辑独立于整个项目的单个文件。当我尝试这样做时,我得到Error while trying to load a compilation databaseRunning without flags. 我认为这是说它忽略了可读性检查,因为它没有像我希望的那样添加大括号。 举一个具体的例子,假设我的文件有#include "../header.h",但我正在编辑一个目录中的文件,而父目录中没有header.h。在这种情况下是否仍然可以使用 clang-tidy? 我已经用额外的信息更新了我的答案,因为它不适合评论。 我不确定我是否能想到编译器标志,它会得到你的特定示例,一个由相对包含引用的文件,工作。 clang-tidy 只是一个静态分析器的前端。它确实需要成为您构建过程的一部分。

以上是关于可以clang格式将大括号添加到单行if语句等的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的单行 if 语句

如何在打开函数的大括号之前使 clang-format 添加新行?

如何将括号与它们包含的代码对齐?

JavaScript 单行 'if' 语句 - 最佳语法,这个替代方案? [关闭]

clang-format 如何不将 if 语句放在一行中?

如何防止空行位于单行 if 语句之间?