#include <filename> 和 #include "filename" 的区别

#include和 #include “filename” 的区别

技术背景

在C和C++编程中,#include 是一个预处理指令,用于将指定文件的内容插入到当前文件中。#include 有两种形式:#include <filename>#include "filename"。了解它们之间的区别对于正确包含头文件至关重要。

实现步骤

1. #include <filename>

  • 预处理器以实现定义的方式搜索文件,通常在编译器或IDE预先指定的目录中搜索。
  • 这种方式常用于包含C标准库的头文件以及与目标平台相关的其他头文件。

2. #include "filename"

  • 预处理器同样以实现定义的方式搜索文件,但通常用于包含程序员自定义的头文件。
  • 通常会先在包含该指令的文件所在的目录中搜索(除非给出了绝对路径)。

3. 不同编译器的搜索规则

  • GCC:可以使用 -I 选项指定额外的搜索目录。对于 #include <file>,会先在 -I 指定的目录和预定义目录中搜索,然后在 .c 文件所在的目录中搜索;对于 #include "file",会先在源文件所在的目录中搜索,然后再在 -I 和预定义目录中搜索。
  • MSVS
    • #include "filename":先在包含 #include 语句的文件所在的目录中搜索,然后在当前打开的包含文件的目录中按打开的逆序搜索,接着沿着 /I 编译器选项指定的路径搜索,最后沿着 INCLUDE 环境变量指定的路径搜索。
    • #include <filename>:先沿着 /I 编译器选项指定的路径搜索,当在命令行编译时,再沿着 INCLUDE 环境变量指定的路径搜索。

核心代码

示例1:包含标准库头文件

1
2
3
4
5
6
7
#include <stdio.h>

int main() {
int a = 3;
printf("a = %d\n", a);
return 0;
}

示例2:包含自定义头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// myfile.h
#ifndef MYFILE_H
#define MYFILE_H

void myFunction();

#endif

// myfile.c
#include "myfile.h"
#include <stdio.h>

void myFunction() {
printf("This is my function.\n");
}

// main.c
#include "myfile.h"

int main() {
myFunction();
return 0;
}

最佳实践

  • 使用 #include <filename>:当包含标准库或系统提供的头文件时,使用 <> 形式,这样可以明确告诉编译器在系统指定的目录中搜索。
  • 使用 #include "filename":当包含自己编写的头文件时,使用 "" 形式,这样可以优先在当前文件所在的目录中搜索。
  • 使用 -I 选项:如果需要在特定的目录中搜索头文件,可以使用 -I 选项指定目录。

常见问题

1. 文件找不到

  • 原因:可能是头文件的路径不正确,或者编译器的搜索路径没有包含头文件所在的目录。
  • 解决方法:检查头文件的路径,确保路径正确;使用 -I 选项指定头文件所在的目录。

2. 重复包含

  • 原因:如果多个文件包含了同一个头文件,可能会导致重复定义的错误。
  • 解决方法:使用头文件保护机制,如 #ifndef#define#endif,或者使用 #pragma once(部分编译器支持)。

3. 不同编译器的兼容性问题

  • 原因:不同编译器对 #include 的搜索规则可能略有不同。
  • 解决方法:查阅编译器的文档,了解其具体的搜索规则,并尽量遵循标准的用法。

#include <filename> 和 #include "filename" 的区别
https://119291.xyz/posts/2025-05-12.difference-between-include-angle-brackets-and-include-quotation-marks/
作者
ww
发布于
2025年5月12日
许可协议