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
- DNS Shell初体验
- 如何在Weka中加载CSV机器学习数据
- 老司机教你部署Cowrie蜜罐
- 时间序列预测如何变成有监督学习问题?
- 追踪溯源 | 希拉里邮箱泄露事件
- DNS Tunneling及相关实现
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]
- 创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
- 从Trace和Debug来看条件编译(Conditional Compilation)
- 解码针对工业工程领域的网络攻击 Operation Ghoul「食尸鬼行动」
- EndpointAddress——不只是一个Uri[上篇]
- EndpointAddress——不只是一个Uri[下篇]
- ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在 Linux 终端中查找域名 IP 地址的命令(五种方法)
- Laravel 表单方法伪造与 CSRF 攻击防护
- Java图形验证码支持gif、中文、算术等
- Go 常见并发模式实现(三):通过无缓冲通道创建协程池
- Linux下安装SVN服务端的方法步骤
- SSM项目频繁打成war包部署,使用tomcat和maven实现热部署配置
- Laravel 视图使用入门
- 基于 Go 协程实现图片马赛克应用(上):同步版本
- Blade 模板引擎入门篇
- 基于 Go 协程实现图片马赛克应用(下):并发重构
- Python入门教程笔记(三)数组
- Greenplum集群Master与Standby相互切换
- Java基础知识三问—百度真题
- 访问权限导致toString返回空BUG分享
- 基于 Spring Boot 的在线考试系统