在 C 中包含文件有两种方法:
#include <headerpath/header.h>
或
#include "headerpath/header.h"
第一个将使用编译器已知的目录来查找文件,因此我们可以包含标准文件而不知道它们在哪里。 第二种方法将仅使用引号之间的路径来查找文件。 (如果搜索失败,编译器会尝试第一种方法)。
我们可以将一个或多个目录添加到编译器知道的目录列表中(第一种方式)。例如,对于 gcc,我们有
-I
选项。
所以最后,以下两段代码是等价的(path_to_header 是一个目录):
1)
#include "path_to_header/header.h"
int main(void)
{
return (0);
} // Compiling with : gcc main.c
2)
#include <header.h>
int main(void)
{
return (0);
} // Compiling with : gcc main.c -I path_to_header
所以我的问题是: 例如,对于我自己的头文件,我应该使用 1) 还是 2) ?为什么 ?也许这只是个人选择?有不同的情况需要了解吗?
感谢您的阅读:)
编辑: 我不是在寻找两种方式之间的区别(我想我按照我的解释理解了它们,感谢这篇文章),我想知道是否有一些特殊情况需要了解,也许是为了小组工作或使用同一个程序有不同的编译器......也许我不知道如何表达我的想法(或者这是一个没有真正答案的愚蠢问题),我必须尝试知道:)。
对于标准库的头文件(可能是预编译的)使用:
#include <stdio.h>
对于项目使用的标题:
#include "project/header.h"
在命令行上使用选项 -I 来获取其他库。
根据C标准,它们之间唯一的标准区别是
#include <...>
包含标头,而#include "..."
包含源文件(如果没有源文件,则回退到<...>
行为)被发现)。所有其他差异均由实现定义。
这种区别很重要,因为例如,像
stdlib.h
这样的标准头实际上可能不是文件,而是由编译器在编译时注入。
对于您自己的代码,由于您不会有这样的头魔法,并且应该确切地知道您想要从自己的工作中包含哪些源文件以及您希望编译器处理哪些源文件(系统库等),所以您应该只使用
<...>
适用于不属于项目文件结构的包含内容。
如果您自己的头文件位于已定义的路径中,例如与使用头文件的文件位于同一文件夹中,则必须使用这种方式“header.h”。 当标头是系统标头且不包含在您包含它的源中时,您必须使用 < header.h >。
在我使用 android.mw 构建的情况下,您可以在所有情况下使用 <>
但是,如果您使用 CMakeLists,JNI 库下的每个包含项都必须使用“”,否则您会找不到文件。