clang-format 的默认 BasedOnStyle 值是多少?

What's the default BasedOnStyle value for clang-format?

如果用户未选择,ClangFormat BasedOnStyle 样式选项是否有默认值?如果有,默认值是多少?

根据 Clang 12 CLANG-FORMAT STYLE OPTIONS 文档的 BasedOnStyle 选项部分,BasedOnStyle 是一个可配置的格式样式选项,可以是 LLVMGoogleChromiumMozillaWebKitMicrosoftGNU。然而,该部分没有提及 BasedOnStyle 是否有默认值。

我在网上搜索了文档来回答这个问题,但没有找到。在 SO 上扫描所有 clang-format 标记的问题以使用 BasedOnStyle 也没有找到答案。鉴于 ClangFormat 来自 LLVM 项目,此选项默认为 LLVM 并不奇怪,但假设此选项有一个似乎不清楚的默认值。

鉴于 SO 上似乎还没有针对此问题的问答,并且猜测其他人也对此感到疑惑或将对此感到疑惑,我想我 post 问题和答案我终于找到了(遗憾的是只有在查看源代码之后)...

clang/include/clang/Format/Format.h file, and also in the RawStringFormats section of the clang/docs/ClangFormatStyleOptions.rst文件的注释中,是下面这句话:

If 'BasedOnStyle' is not found, the formatting is based on llvm style.

这让我回到了我在问题中提到的 Clang 12 的 CLANG-FORMAT STYLE OPTIONS 文档,我意识到这些信息一直存在。它只是不在 BasedOnStyle 部分,但令人困惑的是在 RawStringFormats.

部分

此外,对 clang-format-configurator 的测试似乎证实了默认 BasedOnStyle 值确实是 LLVM 并且 运行 clang-format --dump-config | grep BasedOnStyle 显示:

# BasedOnStyle: LLVM

我也很好奇它是如何工作的。

以下两行代码,在我看来,解释了一切:

const char *DefaultFormatStyle = "file";

const char *DefaultFallbackStyle = "LLVM";

来源:https://github.com/llvm/llvm-project/blob/main/clang/lib/Format/Format.cpp#L2942-L2944

初始化 StyleFallbackStyle 变量时,这些值将用于 ClangFormat.cpp 文件。

来源:https://github.com/llvm/llvm-project/blob/main/clang/tools/clang-format/ClangFormat.cpp#L62-L66

尽管文档指出样式配置需要通过 --style 选项显式传递,但 clang-format 在直接调用时有效。

# File is formatted with default configuration
# or with options from the ".clang-format` file, if present.
clang-format -i <file>