C++核心准则SF.2:.h文件一定不能包含对象定义或者非inline函数定义

时间:2022-07-26
本文章向大家介绍C++核心准则SF.2:.h文件一定不能包含对象定义或者非inline函数定义,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

SF.2: A .h file must not contain object definitions or non-inline function definitions

SF.2:.h文件一定不能包含对象定义或者非inline函数定义

Reason(原因)

Including entities subject to the one-definition rule leads to linkage errors.

对于包含实物对象违反一次定义规则,会导致链接错误。

Example(示例)

// file.h:
namespace Foo {
    int x = 7;
    int xx() { return x+x; }
}

// file1.cpp:
#include <file.h>
// ... more ...

 // file2.cpp:
#include <file.h>
// ... more ...

Linking file1.cpp and file2.cpp will give two linker errors.

链接file1.cpp和file2.cpp时会发生两个链接错误。

Alternative formulation: A .h file must contain only:

另外一种表达方式:头文件只应该包含:

  • #includes of other .h files (possibly with include guards) #include其它.h文件(可能包含include监视)
  • templates 模板
  • class definitions 类定义
  • function declarations 函数声明
  • extern declarations extern声明
  • inline function definitions inline函数定义
  • constexpr definitions 常量表达式定义
  • const definitions 常量表达式
  • using alias definitions using别名定义
  • ???

Enforcement(实施建议)

Check the positive list above.

检查上面的列表。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#sf2-a-h-file-must-not-contain-object-definitions-or-non-inline-function-definitions