这些材料是多年前一些编程人员编写的C++经验。用C++17的经验,重新。
1. 头文件规则
通常每一个.cpp 文件对应一个.h 文件,当然也有特列,main 函数入口 cpp 文件没有对应的.h, 只有纯虚函数的接口类只有.h 文件没有.cpp。
1.1.#define 防止多重包含
所有头文件都应该使用#define 防止头文件被多重包含,这个多重包含指的是一个 cpp 编译过程中不被多次包含,如果有多个 cpp 都调用,那这个文件还 是会被包含多次,所有头文件中不要做定义。
命名格式如果是普通的业务逻辑类的代码比如 x_msg_task.h 的文件就直接定义 X_MSG_TASK_H,如果是做类库或者公用的库,把项目名称加在前面。
实例: 在 x_msg_task.h 头文件中:
#ifndef X_MSG_TASK_H
#define X_MSG_TASK_H
//你的声明代码
#endif
更新实例:
在x_msg_task.h
头文件中使用#pragma once
,如下:
#pragma once // 你的声明代码
1.2.减少头文件依赖
使用前置声明(forward declarations)尽量减少.h 文件中#include 的数量。当一个头文件被包含的同时也引入了一项新的依赖(dependency),只要该头文件被修改 , 代码就要重新编译。如果你的头文件包含了其他头文件,这些头文件的任何改变也将导致那些包含了你的头文件的代码重新编译。因此,我们宁可尽量少包含头文件,尤其是那些包含 在其他头文件中的。
比如用到 XThread 类的指针,在头文件中可以不#include 类文件,而是直接用 class XThread;的声明,但如果类中定义的是实体对象,那就必须要引入头
文件。在.h 中尽量不引用头文件,在.cpp 中引用。
1.3.头文件中不导入命名空间
头文件中不调用 using 导入命名空间,调用是直接写命名空间比如std::string str;命名空间导入在.cpp 中做,因为你没法确认你的.h 会被什么样的文件调用,会不会参数命名冲突。