【问题标题】:clang-format for boost program options用于提升程序选项的 clang 格式
【发布时间】:2016-12-22 17:53:57
【问题描述】:

clang-format 似乎把这样的块弄得一团糟:

desc.add_options()("help", "output usage")
      ("inputDirectory", po::value<boost::filesystem::path>()->required(), "The input path")
      ("outputDirectory", po::value<boost::filesystem::path>()->required(), "The output path");

我知道// clang-format off 明确不格式化块,但是否有一套配置规则可以使它做一些合理的事情?

【问题讨论】:

  • 这不是一个解决方案,但是当将此代码放入format.krzaq.cc/ 时,使用“文件”样式选项,它相对来说是未损坏的。我不知道“文件”的确切含义,但可能值得与该页面的作者核实。
  • 仅供参考,我有 asked the author of format.krzaq.cc on GitHub - repo 中没有 .clang_format 文件,但他们网站上的安装中可能有一个几乎合适的文件。
  • 看来ColumnLimit: 100 可以解决问题。不确定这是否适合您。
  • @krzaq 不是真的 - 这只是因为我们在这里很幸运。如果将限制更改为 150,它会非常奇怪地中断。
  • 我认为你在这里不走运。程序选项与 () 作为运算符链接 - 这样 clang 格式就像它会格式化函数调用一样。也许您应该问自己“这是写下我的意图的最佳/最干净的方式吗?”。考虑为 input-/outputDirectory 部分使用单独的变量。 auto&& outUsage = desc.add_options()("帮助", "输出用法"); outUsage("inputDirectory", ...

标签: c++ boost-program-options clang-format


【解决方案1】:

不确定您是否可以仅通过配置 .clang-format 选项来处理它。但是,您仍然可以对 boost::program_options 语法做一些事情。您可以创建 program_options::options_description 对象并在多行中添加选项,而不是链接 operator()

namespace po = boost::program_options;

po::options_description desc;
desc.add_options()("inputDirectory", po::value<boost::filesystem::path>()->required(), "The input path");

现在,即使 clang-format 破坏了您的格式,我相信这看起来会比以前好一点。如果它对你来说不够好并且格式化是你的痛苦,我建议定义一些函数或任何东西来缩短这些行(在我们的项目中,我们有包含 value_semantic、名称等的 ConfigField 结构向量和我们迭代它调用 add_options - 它看起来更短)。

恐怕别无他法。

顺便说一句:是的,这是一个老问题,但没有答案,我们最近也遇到了类似的问题。

【讨论】:

  • 您可以通过在desc.add_options() 示例中再添加一行来改进答案。读者会更快地看到你的意图。请提供您的矢量解决方案示例。
【解决方案2】:

clang-format 不能删除 cmets,因此在行尾添加 cmets 可以使代码看起来漂亮,同时保持自动缩进的好处。这对于 boost::assign 等库中的项目特别有用。例如,当以 clang 格式使用 100 的 ColumnLimit 时:

    group2 = boost::assign::list_of<score_pair>("Norway", list_of(1)(0))("USA", list_of(0)(0))(
        "Andorra", list_of(1)(1));

    // Versus:

    group2 = boost::assign::list_of<score_pair> //
        ("Norway", list_of(1)(0))               //
        ("USA", list_of(0)(0))                  //
        ("Andorra", list_of(1)(1));

使用上面的 desc.add_options 示例,添加换行 cmets 如下所示:

    desc.add_options()("help", "output usage")                                                 //
        ("inputDirectory", po::value<boost::filesystem::path>()->required(), "The input path") //
        ("outputDirectory", po::value<boost::filesystem::path>()->required(), "The output path");

【讨论】:

    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2018-01-20
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多