两种 include 头文件方式的区别

本文介绍了C++编程中#include< >和#include" "两种头文件包含方式的区别。前者从系统目录开始查找,如VS的安装路径下的include目录;后者则先在源文件所在目录搜索,若未找到再遍历附加包含目录和系统目录。通过实例演示,强调了两者在查找文件顺序上的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

include< > 和 #include” ” 的区别

< > 是从系统目录中寻找,对于 VS 来说,系统目录是类似 D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\ 这样的安装路径,里面包含我们常用的系统头文件;

如果在系统目录里找不到,会在包含目录里找。

ps:如何找到系统目录,使用 everything 搜索 stdio.h 即可。

" " 是首先在使用 include 的源文件所在目录找, 而不是工程文件所在工作目录,如果找不到再去附加包含目录和系统目录找。

举例说明:

//main.cpp
#include <stdio.h>
#include "lbx.h"

int main()
{
	return 0;
}

是 main.cpp 包含 lbx.h,因此会先在 main.cpp 所在的同级目录中查找。

编写一个简单的程序测试一下,主函数保持不变

//这个文件放在 main.cpp 所在的同级目录
#include <stdio.h>
void Test()
{
	printf("this is main");
}

//这个文件放在包含目录下
#include <stdio.h>
void Test()
{
	printf("this is my_include");
}

//这个文件放在 main.cpp 所在的同级目录
#include <stdio.h>
void Test()
{
	printf("this is system");
}

运行结果:
三个文件同时存在:this is main
删除和 main 目录同级的 lbx.h :this is my_include

总结:include “” 查找文件的顺序是 1. 使用 include 的源文件所在目录,2. 包含目录,3. 系统目录。

### C/C++ `#include` 指令 索引头文件 用法 #### 1. 头文件两种形式 在C/C++中,`#include`指令用于引入头文件。它有两种主要的形式: - **双引号形式**:`#include "filename"` 这种方式优先从当前源文件所在的目录开始查找头文件[^1]。如果未找到,则继续按照系统的默认路径进行搜索。 - **尖括号形式**:`#include <filename>` 此方式直接跳过当前工作目录,仅按系统预设的标准路径来寻找头文件。 #### 2. 默认头文件搜索路径 GCC编译器下的默认头文件搜索顺序如下所示: - 对于`#include "..."`的情况,首先会在调用者的同级目录下尝试定位目标头文件; - 接着依次访问以下位置(具体取决于GCC版本及其配置): - `/usr/include/c++/5` - `/usr/include/x86_64-linux-gnu/c++/5` - `/usr/include/c++/5/backward` - `/usr/lib/gcc/x86_64-linux-gnu/5/include` - `/usr/local/include` - `/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed` - `/usr/include/x86_64-linux-gnu` - `/usr/include`[^1] 可以通过执行命令`echo | g++ -v -x c++ -E -`获取详细的搜索路径列表。 #### 3. 自定义头文件路径 当项目中的头文件不在默认路径范围内时,可以借助 `-I` 编译选项手动添加额外的搜索目录。例如: ```bash g++ -I/path/to/custom/header source.cpp -o output ``` 此操作会将 `/path/to/custom/header` 添加至头文件检索队列前端,从而允许编译器在此处发现所需的 `.h` 文件或其他扩展名的头文件。 #### 4. 预处理器行为特性 需要注意的是,所有的宏定义以及条件编译语句均属于预处理阶段的一部分。比如下面的例子展示了如何利用反斜杠`\`跨行书写复杂的宏定义[^2]: ```cpp #define OW "Consistency is the last refuge of the unimagina\ tive.- Oscar Wilde" ``` 另外,在实际开发过程中,合理运用这些机制可以帮助我们更好地管理大型项目的依赖关系并提高代码可读性和维护效率。 #### 5. 使用现代技术简化指针打印 随着C++标准不断演进,新工具也逐渐被纳入其中。例如自C++20起新增加了一个强大的字符串格式化库 `<format>` ,它可以用来优雅地表示复杂数据结构如指针地址等信息[^3]: ```cpp #include <iostream> #include <format> int main(){ double d = 3.14; auto p = &d; // 打印指针值作为十六进制数 std::cout << std::format("{:p}", static_cast<void*>(p)) << '\n'; } ``` 以上方法不仅简洁明了而且具有良好的跨平台表现力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值