RawStringFormats 和 Delimeters 'pb' 在 clang 格式中的含义

Sae*_*eid 7 c++ clang-format

我无法理解以下内容如何影响 clang 格式文件中的格式化行为:

RawStringFormats: 
  - Delimiters:       [pb]
    Language:        TextProto
    BasedOnStyle:    google
Run Code Online (Sandbox Code Playgroud)

这些设置对于 C++ 项目是否正确?(例如,语言不应该是 cpp 吗?)

分隔符的“pb”是什么意思,它与“cc”和“cpp”有什么不同?

我试图在 clang 文档中查找信息,但这只会增加我的困惑。

jes*_*ter 3

[pb]作为分隔符,代表ProtocolBuffers或简称 Protobuf。格式化选项RawStringFormat专门用于充当检测和格式化文件中显示为原始字符串的代码片段的提示(对于支持的语言);它使用Delimiters或 theEnclosingFunctions来检测它们并使用指定的格式化样式重新格式化它们。

如果您希望将格式应用于文件中的原始字符串,那么它甚至在 C++ 项目中也很有用。例如,使用 protobuf 输入和输出的 C++ 项目通常具有如下所示的测试代码:

InputProto ConstructInput() {
  InputProto input;
  Input *in = input.mutable_input();
  in->set_id(10);
  in->set_name("Test");
  return in;
}
TEST(TestFoo, ComputesOut) {
OutputProto out;
out.set_result(200);

EXPECT_THAT(
    GetOutput(ConstructInput()),
    EqualsProto(outcome));
}
Run Code Online (Sandbox Code Playgroud)

Protobuf 允许您使用文本格式以更人类可读的方式编写相同的内容,如下所示:

TEST(TestFoo, ComputesOut) {
EXPECT_THAT(
    GetOutput(PARSE_TEXT_PROTO(R"pb(
        input {
            id: 10
            name: "Test"
        }
      )")),
    EqualsProto(PARSE_TEXT_PROTO(R"pb(
        result: 200
      )"))
    );
}
Run Code Online (Sandbox Code Playgroud)

您的格式化选项会将分隔符内的文本字符串检测pb为 protobuf 代码,并使用google格式化样式重新格式化它。