在C++中,头文件(.h或.hpp)的标准写法

news2025/6/8 17:37:42

目录

    • 1.头文件保护(Include Guards)
    • 2.包含必要的标准库头文件
    • 3.前向声明(Forward Declarations)
    • 4.命名空间
    • 5.注释
    • 示例1:基础头文件
    • 示例2:包含模板和内联函数的头文件
    • 示例3:C++11风格的枚举类头文件
    • 关键点说明
    • 配套的源文件(.cpp)示例

头文件的标准写法

1.头文件保护(Include Guards)

使用#ifndef、#define和#endif防止头文件被多次包含。

2.包含必要的标准库头文件

按需包含标准库头文件(如、等)。

3.前向声明(Forward Declarations)

尽量使用前向声明减少依赖。

4.命名空间

将相关类/函数放入命名空间以避免命名冲突。

5.注释

添加必要的注释说明头文件的功能。

示例1:基础头文件

// my_class.h
#ifndef MY_CLASS_H  // 头文件保护,名称通常为大写+下划线,与文件名一致
#define MY_CLASS_H
 
#include <string>  // 包含必要的标准库头文件
 
// 前向声明(如果需要)
class AnotherClass;
 
// 命名空间
namespace my_project {
 
	// 类声明
	class MyClass {
	public:
	    // 构造函数
	    explicit MyClass(int value);
	 
	    // 成员函数
	    void printValue() const;
	    void setValue(int value);
	    int getValue() const;
	 
	    // 静态成员函数
	    static int getInstanceCount();
	 
	private:
	    int value_;
	    static int instance_count_;  // 静态成员变量
	};
 
} // namespace my_project
 
#endif // MY_CLASS_H

示例2:包含模板和内联函数的头文件

// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
 
#include <cmath>  // 包含数学库
 
namespace math_utils {
 
	// 模板函数(直接在头文件中实现)
	template <typename T>
	T clamp(T value, T min, T max) {
	    if (value < min) return min;
	    if (value > max) return max;
	    return value;
	}
	 
	// 内联函数
	inline double toRadians(double degrees) {
	    return degrees * M_PI / 180.0;
	}
 
} // namespace math_utils
 
#endif // MATH_UTILS_H

示例3:C++11风格的枚举类头文件

// color.h
#ifndef COLOR_H
#define COLOR_H
 
namespace graphics {
 
	// 枚举类(强类型枚举)
	enum class Color {
	    RED,
	    GREEN,
	    BLUE,
	    ALPHA
	};
	 
	// 函数声明
	void printColor(Color color);
 
} // namespace graphics
 
#endif // COLOR_H

关键点说明

头文件保护
	宏名称通常与文件名一致(如MY_CLASS_H对应my_class.h)。
	避免使用_开头的宏名(可能与系统宏冲突)。
	
前向声明
	如果头文件只需声明类的存在(而非完整定义),使用前向声明减少编译依赖。
	
命名空间
	将类/函数放入命名空间,避免全局作用域的命名冲突。
	
	模板和内联函数
		模板和内联函数通常直接在头文件中实现,因为编译器需要看到完整定义。
注释
添加注释说明头文件的用途或作者信息(可选)。

配套的源文件(.cpp)示例

// my_class.cpp
#include "my_class.h"  // 包含对应的头文件
 
namespace my_project {
 
	// 静态成员变量初始化
	int MyClass::instance_count_ = 0;
	 
	// 构造函数
	MyClass::MyClass(int value) : value_(value) {
	    instance_count_++;
	}
	 
	// 成员函数实现
	void MyClass::printValue() const {
	    std::cout << "Value: " << value_ << std::endl;
	}
	 
	void MyClass::setValue(int value) {
	    value_ = value;
	}
	 
	int MyClass::getValue() const {
	    return value_;
	}
	 
	int MyClass::getInstanceCount() {
	    return instance_count_;
	}
 
} // namespace my_project

通过遵循这些规则,可以确保头文件的正确性和可维护性,同时减少编译错误和命名冲突的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2404374.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows平台RTSP/RTMP播放器C#接入详解

大牛直播SDK在Windows平台下的RTSP、RTMP播放器模块&#xff0c;基于自研高性能内核&#xff0c;具备极高的稳定性与行业领先的超低延迟表现。相比传统基于FFmpeg或VLC的播放器实现&#xff0c;SmartPlayer不仅支持RTSP TCP/UDP自动切换、401鉴权、断网重连等网络复杂场景自适应…

从 JDK 8 到 JDK 17:Swagger 升级迁移指南

点击上方“程序猿技术大咖”&#xff0c;关注并选择“设为星标” 回复“加群”获取入群讨论资格&#xff01; 随着 Java 生态向 JDK 17 及 Jakarta EE 的演进&#xff0c;许多项目面临从 JDK 8 升级的挑战&#xff0c;其中 Swagger&#xff08;API 文档工具&#xff09;的兼容性…

使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现

使用 Coze 工作流一键生成抖音书单视频&#xff1a;全流程拆解与技术实现&#xff08;提供工作流&#xff09; 摘要&#xff1a;本文基于一段关于使用 Coze 平台构建抖音爆火书单视频的详细讲解&#xff0c;总结出一套完整的 AI 视频自动化制作流程。内容涵盖从思路拆解、节点配…

【发布实录】云原生+AI,助力企业全球化业务创新

5 月 22 日&#xff0c;在最新一期阿里云「飞天发布时刻」&#xff0c;阿里云云原生应用平台产品负责人李国强重磅揭晓面向 AI 场景的云原生产品体系升级&#xff0c;通过弹性智能的一体化架构、开箱即用的云原生 AI 能力&#xff0c;为中国企业出海提供新一代技术引擎。 发布会…

LabVIEW主轴故障诊断案例

LabVIEW 开发主轴机械状态识别与故障诊断系统&#xff0c;适配工业场景主轴振动监测需求。通过整合品牌硬件与软件算法&#xff0c;实现从信号采集到故障定位的全流程自动化&#xff0c;为设备维护提供数据支撑&#xff0c;提升数控机床运行可靠性。 ​ 面向精密制造企业数控机…

计算机组成与体系结构:补码数制二(Complementary Number Systems)

目录 4位二进制的减法 补码系统 &#x1f9e0;减基补码 名字解释&#xff1a; 减基补码有什么用&#xff1f; 计算方法 ❓为什么这样就能计算减基补码 &#x1f4a1; 原理揭示&#xff1a;按位减法&#xff0c;模拟总减法&#xff01; 那对于二进制呢&#xff1f;&…

C#使用MindFusion.Diagramming框架绘制流程图(2):流程图示例

上一节我们初步介绍MindFusion.Diagramming框架 C#使用MindFusion.Diagramming框架绘制流程图(1):基础类型-CSDN博客 这里演示示例程序: 新建Windows窗体应用程序FlowDiagramDemo,将默认的Form1重命名为FormFlowDiagram. 右键FlowDiagramDemo管理NuGet程序包 输入MindFusio…

【物联网-ModBus-RTU

物联网-ModBus-RTU ■ 优秀博主链接■ ModBus-RTU介绍■&#xff08;1&#xff09;帧结构■&#xff08;2&#xff09;查询功能码 0x03■&#xff08;3&#xff09;修改单个寄存器功能码 0x06■&#xff08;4&#xff09;Modbus RTU 串口收发数据分析 ■ 优秀博主链接 Modbus …

Java应用10(客户端与服务器通信)

Java客户端与服务器通信 Java提供了多种方式来实现客户端与服务器之间的通信&#xff0c;下面我将介绍几种常见的方法&#xff1a; 1. 基于Socket的基本通信 服务器端代码 import java.io.*; import java.net.*;public class SimpleServer {public static void main(String…

Python_day47

作业&#xff1a;对比不同卷积层热图可视化的结果 一、不同卷积层的特征特性 卷积层类型特征类型特征抽象程度对输入的依赖程度低层卷积层&#xff08;如第 1 - 3 层&#xff09;边缘、纹理、颜色、简单形状等基础特征低高&#xff0c;直接与输入像素关联中层卷积层&#xff08…

如何在mac上安装podman

安装 Podman 在 macOS 上 在 macOS 上安装 Podman 需要使用 Podman 的桌面客户端工具 Podman Desktop 或通过 Homebrew 安装命令行工具。 使用 Homebrew 安装 Podman&#xff1a; (base) ninjamacninjamacdeMacBook-Air shell % brew install podman > Auto-updating Hom…

小黑一层层削苹果皮式大模型应用探索:langchain中智能体思考和执行工具的demo

引言 小黑黑通过探索langchain源码&#xff0c;设计了一个关于agent使用工具的一个简化版小demo&#xff08;代码可以跑通&#xff09;&#xff0c;主要流程&#xff1a; 1.问题输入给大模型。 2.大模型进行思考&#xff0c;输出需要执行的action和相关思考信息。 3.通过代理&…

阿里云ACP云计算备考笔记 (4)——企业应用服务

目录 第一章 企业应用概览 第二章 云解析 1、云解析基本概念 2、域名管理流程 3、云解析记录类型 4、域名管理 ① 开启注册局安全锁 ② 域名赎回 第二章 内容分发网络CDN 1、CDN概念 2、使用CDN前后对比 3、使用CDN的优势 4、阿里云CDN的优势 5、配置网页性能优化…

ARM SMMUv3简介(一)

1.概述 SMMU&#xff08;System Memory Management Unit&#xff0c;系统内存管理单元&#xff09;是ARM架构中用于管理设备访问系统内存的硬件模块。SMMU和MMU的功能类似&#xff0c;都是将虚拟地址转换成物理地址&#xff0c;不同的是MMU转换的虚拟地址来自CPU&#xff0c;S…

hadoop集群datanode启动显示init failed,不能解析hostname

三个datanode集群&#xff0c;有一个总是起不起来。去查看log显示 Initialization failed for Block pool BP-1920852191-192.168.115.154-1749093939738 (Datanode Uuid 89d9df36-1c01-4f22-9905-517fee205a8e) service to node154/192.168.115.154:8020 Datanode denied com…

浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的

引用 浏览器工作原理与实践 一、提出问题 在上一篇文章中我们介绍了导航相关的流程&#xff0c;那导航被提交后又会怎么样呢&#xff1f;就进入了渲染阶段。这个阶段很重要&#xff0c;了解其相关流程能让你“看透”页面是如何工作的&#xff0c;有了这些知识&#xff0c;你可…

|从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面

&#x1f411; |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 &#x1f411; 文章目录 &#x1f411; |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 &#x1f411;♈前言♈♈调取Deepseek大模型♈♒准备工作♒♒调用API♒ ♈将模型嵌入到ui界面中♈♈…

pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)

目录 一、SQL注入 二、搜索型注入 三、源码分析 1、渗透思路1 2、渗透思路2 四、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入百分号单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取…

产品笔试专业名词梳理

目录 产品常识 四种常见广告形式 贴片广告 中插广告 信息流广告 横幅广告 BAT和TMD BAT TMD 付费渗透率 蓝海市场、红海市场 蓝海市场 红海市场 竞品研究 SWOT分析 SWOT分析的核心目的&#xff1a; SWOT分析的优点&#xff1a; SWOT分析的局限与注意事项&…

【前端】es6相关,柯里化

0. 严格模式 严格模式的概念从ES6引进。通过严格模式&#xff0c;可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷&#xff1a;有时…