Clang 格式换行符

2024-01-01

我正在寻找一个clang-format设置以防止工具删除换行符。

例如,我有我的ColumnLimit设置为 120,这是我重新格式化一些示例代码时发生的情况。

Before:

#include <vector>
#include <string>

std::vector<std::string> get_vec()
{
   return std::vector<std::string> {
      "this is a test",
      "some of the lines are longer",
      "than other, but I would like",
      "to keep them on separate lines"
   };
}

int main()
{
   auto vec = get_vec();
}

After:

#include <vector>
#include <string>

std::vector<std::string> get_vec()
{
   return std::vector<std::string>{"this is a test", "some of the lines are longer", "than other, but I would like",
         "to keep them on separate lines"};
}

int main()
{
   auto vec = get_vec();
}

我想要的是,该工具会中断超过 120 个字符的行,但不会仅仅因为它们少于 120 个字符就决定合并行。

有这样的选择吗?文档中没有任何内容对我来说很突出。


因此,在弄乱了 clang 格式代码并制作了一些补丁之后,这是我的两分钱:

  • Clang 格式基于,

    • 使用以下方法解析 ASTlibclang,这基本上消除了所有空白
    • 将令牌序列分解为“展开的行”,就像“逻辑”代码行
    • 应用规则/配置信息有时将“展开的行”分割成更小的单元
    • 使用新的空格/缩进再次将其全部吐出来

    让它尊重原始的whitepsace并不容易,当你第一次解析代码时,这种情况会被抛弃。

  • 您可以通过以下方式最轻松地控制换行符的位置

    • 设置列限制
    • 使用“bin pack 参数”选项
    • 为各种中断设置惩罚——在函数返回类型之后中断、在第一次调用参数之前中断、中断字符串文字、中断注释...
    • 将注释放在行尾(clang 格式无法删除注释,因此必须拆分行)
    • 使用 clang-format off / on 指令

您可以尝试以下一件事:

std::vector<std::string> get_vec()
{
   return std::vector<std::string> {   //
      "this is a test",                //
      "some of the lines are longer",  //
      "than other, but I would like",  //
      "to keep them on separate lines" //
   };
}

这样做的优点是// clang-format off就是,如果您稍后更改制表符宽度或其他选项,这些代码行仍然会获得这些格式更改,因此您无需手动进入// clang-format off地区来修复它。然而,它仍然有点黑客,YMMV。

最终,clang-format很大程度上是在整个代码库上采用统一的格式,确保程序中所有字符串文字的格式都相同。如果您想对换行决策进行微观控制,这并不符合该工具的精神,您必须执行诸如禁用它之类的操作。

这有时会令人沮丧,尤其是。当你想用数组做事情并对齐列或其他东西时——例如,下面是来自 lua C api 的一些自然代码:

static luaL_Reg const methods[] = {
    {"matches",               &dispatch::intf_match_unit},
    {"to_recall",             &dispatch::intf_put_recall_unit},
    {"to_map",                &dispatch::intf_put_unit},
    {"erase",                 &dispatch::intf_erase_unit},
    {"clone",                 intf_copy_unit},
    {"extract",               &dispatch::intf_extract_unit},
    {"advance",               intf_advance_unit},
};

当 clang-format 运行时,它通常不会对齐右列,而是在逗号后面放置固定数量的空格,据我所知,您对此无能为力。

或者,如果您有 4 x 4 矩阵供 OpenGL 使用:

      constexpr float shadow_skew_hardcoded[16] =
        { 1.0f, 0.0f, 0.0f, 0.0f,
          0.5f, 0.5f, 0.0f, 0.0f,
          0.0f, 0.0f, 1.0f, 0.0f,
          0.0f, 0.0f, 0.0f, 1.0f };

如果你让 clang-format 运行这样的东西,它只会破坏它们,而且据我所知,没有简单的方法可以让它很好地格式化它们,所以你只需要诉诸“大量琐碎的评论”黑客,或者使用当你有这样的东西时,请关闭 clang-format 。这些只是该工具的固有局限性。如果您不喜欢做这样的事情,那么它可能不适合您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clang 格式换行符 的相关文章

  • 是否有可能劫持标准输出

    我正在尝试使用 C 重定向 Windows XP 上已运行进程的标准输出 我知道如果我自己生成进程 我可以做到这一点 但对于这个应用程序 我更喜欢一个 监听器 我可以附加到另一个进程 这在纯 Net 中可能吗 如果不可能 在 Win32 中
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 如何在特定时间以毫秒精度触发 C# 函数?

    我有两台计算机 它们的时间通过 NTP 同步 确保时间仅相差几毫秒 其中一台计算机将通过 TCP 向另一台计算机发送一条消息 以在两台计算机上的未来指定时间启动某个 c 函数 我的问题是 如何在特定时间以毫秒精度 或更好 触发 C 中的函数
  • C# 无法捕获 SerializationException

    我的程序在加载序列化文件的部分遇到问题 如果文件无法反序列化 我希望很好地失败 但由于某种原因 我的程序将中断而不是进入 catch 子句 这是我的代码 using FileStream fs new FileStream openFile
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 如何减少 MinGW g++ 编译器生成的可执行文件的大小?

    我有一个简单的 Hello world C 程序 在 Win XP 下由 MinGW g 编译器编译为 500kB 可执行文件 有人说这是由于iostream的库和静态链接libstdc dll Using s链接器选项有点帮助 减少了 5
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 如何让XmlReader读取C#中的属性?

    我有一个 XML Stream 其中包含以下 XML 内容
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • 连接到没有元数据的网络服务

    我想连接到此网络服务 https training api temando com schema 2009 06 server wsdl https training api temando com schema 2009 06 serve
  • 如何将System.Windows dll添加到Visual Studio 2010 Express?

    我正在开发一个小型应用程序C and VS2010 as IDE with NET框架4 我想用CaptureSource类以便从笔记本电脑的网络摄像头捕获视频 为此我需要添加一个命名空间System Windows DependencyO
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 如何在c#中创建多线程

    我需要监听机器中的所有串行端口 假设我的机器有 4 个串行端口 我必须创建 4 个线程并开始分别使用附加线程监听每个端口 我使用此代码来获取我的机器中的端口数量 private SerialPort comPort new SerialPo
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类
  • 使用 CodeDOM 将程序集添加到 BuildManager 会导致间歇性错误

    我正在使用 CodeDOM 在运行时创建内存中程序集 如下所示 public Assembly Compile CodeCompileUnit targetUnit string path Path GetDirectoryName new

随机推荐

  • Int32.Equals 与 '==' 运算符

    我环顾四周 但似乎没有人问过这个问题 所以就这样吧 我正在开发一个自定义类 它将具有IEquatable界面 因此我正在制作自己的Equals方法 它看起来是这样的 public bool Equals QueryFilter qfilte
  • C++“new”运算符是如何实现的

    Class B B b new B default constructor B b1 new B 10 constructor which takes an argument B int x 但是 如果我们想编写一个自定义版本new 语法是
  • 使用现有私钥创建 CSR

    我想做的是 创建一个 CSR 并使用受密码保护的私钥 密钥 在 OpenSSL 中 我可以创建一个带有密码的私钥 如下所示 openssl genrsa des3 out privkey pem 2048 有什么方法可以使用我刚刚创建的密钥
  • 使用 C# 调用 php 脚本 (Unity)

    我对 Unity 和 PHP 都很陌生 目前我正在开发一个项目 可以使用 PHP 将数据从 MySQL 数据库解析到 Unity 我最初想尝试启用一种方法 用户可以更改 php 脚本并使其能够选择不同的数据表 但是有人建议我列出 php 脚
  • 如何从 nginx 发出相对 URL 重定向?

    如何在 nginx 中配置重定向以相对重定向到特定路径来响应某个 url The Nginx 文档 https www nginx com resources wiki start topics tutorials config pitfa
  • Android中的动态相对布局

    我正在尝试将两个图像放在一起 我可以让它与 xml 文件一起正常工作 但我想动态地执行此操作 ctdeasyone 是一个透明图像 所以这工作正常
  • Git推送错误:无法创建'.git/refs/remotes/jr/master.lock':文件存在

    这不是重复的 我看过这个堆栈溢出帖子 https stackoverflow com questions 8500089 fatal unable to create refs heads master lock file exists f
  • Knockoutjs 验证 areSame 或 MustMatch 示例

    我正在尝试使用 GitHub 上的 Knockoutjs 验证插件 大部分似乎工作得很好 但是当我尝试使用扩展验证 MustEqual password confirm password 时 它似乎没有做任何事情 我缺少什么 我非常想学习这
  • 如何在SQLite中进行递归查询?

    如果我的数据结构是这样的 parentA parentAA parentAAA childA 如果我能得到 childA name 我怎样才能知道所有父级的名字直到顶层 所以它会像这样 gt parentA parentAA parentA
  • 如何从 Azure Function App 中的请求正文检索字节数据

    在 Python 中 我将图像转换为字节 然后 我将字节传递到 Azure HTTP 触发器函数应用端点 URL Azure 门户 就像调用 Azure 认知服务时一样 image path r C Users User Desktop b
  • NSURL、URL 和 NSData、数据

    我是斯威夫特的新手 当我遇到这个问题时 我正在从互联网上获取图像NSURL and URL and NSData and Data 我真的很困惑 我使用哪些 我使用了以下代码 但我必须转换类型 如下所示 这样做的正确方法是什么以及两者之间的
  • 避免测试时由于 readline() 造成的暂停

    我正在 R 中使用以下命令运行测试test dir 函数从testthat包裹 在一些测试脚本中 有一些函数调用readline 这在交互模式下会导致测试暂停并等待用户输入 调用的函数readline 不是我自己的 我对他们没有任何影响 用
  • 强制重新加载表视图

    All 当按下按钮时 如何强制每五秒重新加载一个表视图 在视图控制器内 持续十五秒 谢谢 詹姆士 首先 当您按下按钮时创建一个计时器 NSTimer timer NSTimer scheduledTimerWithTimeInterval
  • JQuery CORS 和重定向

    使用 JQuery 1 8 2 我正在从一个 AppServer 向应用程序发出 CORS 请求 Front 到另一个应用程序服务器 Back 服务器 当我进行以下 Ajax 调用时Front 来自的 302 响应 安全检查 Back很荣幸
  • 从 .tar.gz 将模块安装到 Anaconda

    当我想将模块安装到 Anaconda 时 我运行conda install 然而 现在我有一个 tar gz文件并想要安装它 怎么做 有多种方法可以实现此目的 我在这里描述一种方法 即使您的默认方法也应该相对简单python变量不是 ana
  • 更新应用商店错误 - 找不到启动故事板

    我的应用程序已在应用程序商店中发布 6 个月 我现在尝试发布更新 但在验证应用程序时遇到错误 找不到启动故事板 确保为 Info plist 中的键 UILaunchStoryboardName 指定不带文件扩展名的启动故事板文件名 我所做
  • 如何优化 TradingView Pine 脚本中的参数? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想优化 TradingView Pine 回测中的指标参数 这对于其他工具来说是可能的 但是当我在
  • 使用 ggplot 在 R 中绘制多个大型时间序列时出现问题

    我有一个包含 16 个独立时间序列的大型数据集 我想将它们绘制在 3x7 网格中 顶行是每个以 IN 结尾的时间序列 底行是每个以 OUT 结尾的时间序列 在中间行中 我将重复对应于每个 IN OUT 对的以 RN 结尾的两个时间序列中的每
  • PDOStatement 包含什么以及 fetch/fetchAll 有什么用?

    我无法理解 1 PDOStatement 对象内部有什么以及 2 为什么我需要 fetch 或 fetchAll 方法 我的数据库 一个名为 动物 的简单表 有 3 列 id 名称 物种 My code try pdo new PDO ds
  • Clang 格式换行符

    我正在寻找一个clang format设置以防止工具删除换行符 例如 我有我的ColumnLimit设置为 120 这是我重新格式化一些示例代码时发生的情况 Before include