目录

基本概念

#include<>(尖括号包含)

#include""(双引号包含)

核心区别:搜索路径顺序

#include<> 的搜索顺序

#include" " 的搜索顺序

详细对比分析

1. 使用场景差异

2. 编译器实践示例

跨平台注意事项

Windows vs Linux

实践建议

1. 明确的包含策略

2. 避免的常见错误

3. 路径管理技巧

高级主题

1. 包含守卫(Include Guards)

2. 前置声明替代包含

总结

        在 C/C++ 编程中,#include 是每个开发者都会频繁使用的重要预处理指令。然而,许多开发者对于 #include<> 和 #include"" 的区别理解不够深入。本文将全面解析这两种包含方式的区别,帮助你做出更合适的选择。

基本概念

#include<>(尖括号包含)

#include <iostream>
#include <vector>
#include <string>

#include""(双引号包含)

#include "myheader.h"
#include "../utils/helper.h"
#include "config.h"

核心区别:搜索路径顺序

#include<> 的搜索顺序

  1. 系统标准头文件目录

    • 编译器内置的标准库路径

    • 操作系统提供的系统头文件路径

  2. 编译器指定的包含路径

    • 通过 -I 选项添加的目录

    • 环境变量指定的路径

#include" " 的搜索顺序

  1. 当前文件所在目录

  2. 当前编译单元所在目录

  3. 编译器指定的包含路径(与 #include<> 共享)

  4. 系统标准头文件目录

详细对比分析

1. 使用场景差异

使用 #include<> 的情况:

  • 包含标准库头文件

  • 包含系统提供的头文件

  • 包含第三方库的头文件

// 标准库
#include <iostream>
#include <vector>

// 系统头文件
#include <windows.h>    // Windows
#include <unistd.h>     // Linux/Unix

// 第三方库
#include <boost/algorithm/string.hpp>
#include <openssl/ssl.h>

使用 #include"" 的情况:

  • 包含项目自定义头文件

  • 包含相对路径的头文件

  • 包含同一模块内的头文件

// 项目自定义头文件
#include "myclass.h"
#include "utils/helper.h"

// 相对路径
#include "../include/config.h"
#include "./local_header.h"

2. 编译器实践示例

让我们通过具体示例来验证搜索路径的区别:

项目结构:

project/
├── main.cpp
├── myheader.h
├── include/
│   └── system.h
└── libs/
    └── thirdparty.h

main.cpp 内容:

cpp

#include <iostream>      // 标准库,使用 <>
#include "myheader.h"    // 当前目录,使用 ""
#include <system.h>      // 通过 -I 指定,使用 <>
#include "thirdparty.h"  // 通过 -I 指定,但使用 ""

跨平台注意事项

Windows vs Linux

Windows 下的特点:

  • 路径分隔符使用 \ 

  • 不区分大小写(通常)

  • 可能有额外的系统目录

cpp

// Windows
#include <windows.h>
#include "resource.h"

Linux 下的特点:

  • 路径分隔符使用 /

  • 严格区分大小写

  • 标准路径如 /usr/include

cpp

// Linux
#include <sys/types.h>
#include "local_config.h"

实践建议

1. 明确的包含策略

推荐做法:

// 标准库和系统头文件
#include <vector>
#include <string>
#include <sys/time.h>

// 第三方库
#include <gtest/gtest.h>
#include <json/json.h>

// 项目内部头文件
#include "project/core.h"
#include "utils/logger.h"
#include "gui/mainwindow.h"

2. 避免的常见错误

不推荐的混用:

// 错误:用 <> 包含项目文件
#include <myprojectheader.h>  // 不推荐

// 错误:用 "" 包含标准库
#include "iostream"           // 不推荐,虽然可能工作但不规范

3. 路径管理技巧

使用相对路径:

#include "../common/types.h"        // 上级目录
#include "./local_utils.h"          // 当前目录
#include "submodule/interface.h"    // 子目录

高级主题

1. 包含守卫(Include Guards)

无论使用哪种包含方式,都应该使用包含守卫防止重复包含:

// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H

// 头文件内容

#endif // MYHEADER_H

2. 前置声明替代包含

在某些情况下,使用前置声明可以减少头文件依赖:

// 使用前置声明替代 #include
class MyClass;  // 前置声明

void processObject(MyClass* obj);  // 只需要指针或引用时

总结

#include< > 和 #include" " 的主要区别在于搜索路径的顺序。正确的使用习惯不仅使代码更加规范,还能:

  1. 提高编译效率 - 减少不必要的搜索时间

  2. 避免命名冲突 - 明确区分系统文件和项目文件

  3. 增强可移植性 - 符合跨平台开发规范

  4. 改善代码可读性 - 让其他开发者清楚头文件来源

记住这个简单的原则:系统及第三方库用 <>,项目自己的文件用 ""。遵循这个约定能让我们的 C/C++ 项目更加专业和可维护。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐