【问题标题】:What is proper LLVM header guard style?什么是正确的 LLVM 标头保护样式?
【发布时间】:2017-10-08 10:03:54
【问题描述】:

在 clang tidy 中,检查 [llvm-header-guard] 查找 LLVM 样式的标头保护,但我找不到任何适当的 LLVM 标头保护样式的示例,特别是给定义的名称的结构,coding standards 页面什么都没提。

【问题讨论】:

  • 根据链接,llvm-header-guard 会修复一个不遵守的,那么你运行它并查看结果了吗?您还可以检查现有的 LLVM 标头以查看它们的外观。
  • 上次我检查(今天)llvm-header-guard 要求我在保护标签前面加上一个未标记,它建议类似:_HOME_USER_PRJ_DETAIL_FILENAME_HPP。虽然其他整洁的规则告诉我不要(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp),但我必须禁用llvm-header-guard

标签: c++ llvm llvm-clang include-guards clang-tidy


【解决方案1】:

查看单元测试:

它似乎接受了常用模式的一些变化。对于名为 include/llvm/ADT/foo.h 的文件,约定似乎是:

#ifndef LLVM_ADT_FOO_H
#define LLVM_ADT_FOO_H
//...
#endif // LLVM_ADT_FOO_H

【讨论】:

  • 您还可以通过查看EndOfMainFile in HeaderGuard.cpp 中的宏检查循环来收集一些逻辑。在那里,它解析头部保护,然后自动生成一个保护并检查它们是否相同。如果没有,这是一个警告。
【解决方案2】:

大概 LLVM 代码库遵循 LLVM 编码标准,因此可以简单地查看一些 LLVM 头文件来了解守卫的外观。以下是我查看的一些随机 LLVM 头文件:

https://github.com/llvm-mirror/llvm/blob/master/include/llvm/CodeGen/SelectionDAG.h

https://github.com/llvm-mirror/llvm/blob/master/include/llvm/Support/AlignOf.h

基于这些文件,我认为标头保护看起来像这样:

#ifndef LLVM_CODEGEN_SELECTIONDAG_H
#define LLVM_CODEGEN_SELECTIONDAG_H
...
#endif

【讨论】:

  • 我正在寻找定义名称的结构,从链接看起来它是包含目录的路径。很高兴看到它被 LLVM 拼写出来。
  • 这是一个很好的答案。不仅适用于 LLVM - 它是 ANY 编译器、C 或 C++ 的合理约定。我认为做比这更复杂的事情是非常不明智的。海事组织...
【解决方案3】:

LLVM 检测并满意您的标头的正确样式是采用用于包含标头的路径,将其转换为大写,用下划线替换目录分隔符,并用下划线替换文件扩展名中的点。

例如,如果您使用#include <dopelib/dopestuff/whatitisyo.h>,您的标题将是:

#ifndef DOPELIB_DOPESTUFF_WHATITISYO_H
#define DOPELIB_DOPESTUFF_WHATITISYO_H

/** Your code here. **/

#endif

希望这会有所帮助!

【讨论】:

  • 我发了这篇文章,但显然 Stack Overflow 不再做帐户链接了?
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多