当前位置: 首页 > news >正文

C++ - 头文件基础(常用标准库头文件、自定义头文件、头文件引入方式、防止头文件重复包含机制)

一、头文件

  1. 在 C++ 中,头文件(.h)用于函数声明、类定义、宏定义等等

  2. 在 Visual Studio 中,头文件通常放在头文件目录中,头文件实现通常放在源文件目录中


二、常用标准库头文件

1、输入输出
  • <iostream> 标准输入输出流
#include <iostream>

using namespace std;

int main() {

	cout << "Hello World" << endl;

	return 0;
}
2、容器
  1. <string> 字符串处理
#include <string>

using namespace std;

int main() {

	string s = "Hello World";

	return 0;
}
  1. <vector> 动态数组
#include <vector>

using namespace std;

int main() {

	vector<int> nums = { 1, 2, 3 };

	return 0;
}
3、多线程
  • <thread> 线程支持
#include <iostream>
#include <thread>

using namespace std;

void threadFunction() {
	std::cout << "Hello Thread" << endl;
}

int main() {

	thread t(threadFunction);

	t.join();

	return 0;
}

三、自定义头文件

  1. 头文件 math_utils.h
#pragma once

#include <iostream>

namespace math {

	int square(int x);

	void printSquare(int x);
}
  1. 头文件实现 math_utils.cpp
#include "math_utils.h"

namespace math {

    int square(int x) {
        return x * x;
    }

    void printSquare(int x) {
        std::cout << "Square of " << x << " is " << square(x) << std::endl;
    }
}
  1. 测试代码 math_utils_test.cpp
#include "math_utils.h"
#include <iostream>

int main() {
	
	std::cout << math::square(5) << std::endl;
	math::printSquare(4);

	return 0;
}

四、头文件引入方式

1、使用双引号
#include "math_utils.h"
  1. 首先,编译器在当前源文件所在目录搜索

  2. 然后,编译器在指定的包含路径中搜索(例如,-I 选项指定的路径)

  3. 最后,编译器在标准系统包含路径中搜索

  4. 这种方式通常用于包含用户自定义的头文件

2、使用尖括号
#include <iostream>
  1. 编译器不会在当前目录搜索

  2. 编译器直接在标准系统包含路径中搜索

  3. 这种方式通常用于包含标准库头文件


五、防止头文件重复包含机制

1、基本介绍
  1. #pragma once 是 C++ 中用于防止头文件重复包含的编译器指令

  2. #include "math_utils.h" 这行代码来举例,重复包含就是写了多次这行代码

  3. 头文件使用 #pragma once 后,当编译器首次包含头文件时,会记录该头文件的唯一标识(完整路径)

  4. 后续再遇到相同的包含头文件时,编译器会直接跳过其内容

  5. #pragma once 是传统头文件保护宏(#ifndef / #define /#endif)的现代替代方案

2、演示
(1)未防止重复包含
  1. 头文件 math_utils.h,未添加 #pragma once
int globalVar = 10;
  1. 测试代码 my_header_test.cpp,重复包含了头文件
#include "my_header.h"
#include "my_header.h"

#include <iostream>

using namespace std;

int main() {

	cout << globalVar << endl;

	return 0;
}
# 输出结果

C2374	“globalVar”: 重定义;多次初始化	
(2)防止重复包含
  1. 头文件 math_utils.h,添加了 #pragma once
int globalVar = 10;
  1. 测试代码 my_header_test.cpp,重复包含了头文件
#include "my_header.h"
#include "my_header.h"

#include <iostream>

using namespace std;

int main() {

	cout << globalVar << endl;

	return 0;
}
# 输出结果

10

相关文章:

  • 多模态大语言模型arxiv论文略读(六)
  • 计算机视觉——为什么 mAP 是目标检测的黄金标准
  • c# 企业级ADB通信示例
  • 使用 new EventSource 实现前端实时通信
  • 数智化重构供应商管理
  • Java大视界:解码航天遥测数据的银河密码——从GB到PB的技术革命
  • Dubbo 注册中心与服务发现
  • 健身管理小程序|基于java微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)
  • Web框架 --- Web服务器和Web应用服务器
  • Baumer工业相机堡盟工业相机如何处理偶发十万分之一或百万分之一几率出现的黑图现象(C#)
  • R语言之mlr依赖包缺失警告之分析
  • 【Redis】——最佳实践
  • 【区块链安全 | 第三十六篇】合约审计之自毁函数
  • 找不到导入的项目“xxx\QtMsBuild\Qt.props”。请确认 Import 声明“$(QtMsBuild)\Qt.props”中计算结果为
  • R语言进行判别分析
  • 十二、buildroot系统 adb登录权限设置
  • GitHub 趋势日报 (2025年04月07日)
  • Axure 列表滚动:表头非常多(横向滚动方向)、分页(纵向滚动) | 基于动态面板的滚动方向和取消调整大小以适合内容两个属性进行实现
  • MySQL表操作
  • 一文详解LibTorch环境搭建:Ubuntu20.4配置LibTorch CUDA与cuDNN开发环境
  • 利用养生网站做竞价引流/百度指数网址是多少
  • 网站开发凭证做什么科目/今日最新闻
  • 国土分局网站建设方案/中国十大流量网站
  • 上海二手房网站/seo可以从哪些方面优化
  • 做插画的网站/seo高手是怎样炼成的
  • 怎样做一个好的网站/腾讯企点qq